【背景】
一直想試試單機(jī)多實例,玩下MySQL的主從復(fù)制阱扬;之前偶爾也研究過泣懊,由于各種原因,種種失敿廴稀嗅定;
今天偶得閑暇自娩,再次嘗試用踩,沒想到還挺順利的,謝謝網(wǎng)上的各位大牛忙迁,終于如常所愿脐彩,裝逼了一把;
【前提準(zhǔn)備】
下載MySQL(原先一大攔路虎是編譯MySQL姊扔,今天發(fā)現(xiàn)可以不用編譯的惠奸,下載編譯后的版本即可)下載傳遞門;
-
按照參考1中的步驟恰梢,一步一步下來佛南,參考1中,將MySQL放在了/tmp目錄下嵌言,不是很喜歡嗅回,做了調(diào)整,放在了~/Dev/mysql;
我這里的目錄安排是:
圖1.png
與參考1的區(qū)別是:
- 新建了mysql_multi目錄摧茴,存放data_3307绵载,data_3308(系統(tǒng)自帶的MySQL運(yùn)行在3306,在此端口號順移一個)而且運(yùn)行時的sock文件也放在對應(yīng)的data下面,后文將會看到娃豹;
- 新建了logs目錄焚虱,喜歡將各自的應(yīng)用的logs放在自己的目錄下,方便查找懂版;
conf的配置
3307配置鹃栽,存放位置conf/3307.cnf
因為是需要嘗試主從復(fù)制,所以定续,主從復(fù)制的配置也可以體現(xiàn)
[client]
default-character-set=utf8 #客戶端連接編碼
[mysql]
auto-rehash #客戶端tab補(bǔ)全
default-character-set=utf8 #編碼
[mysqld]
user=mysql #運(yùn)行賬戶
port=3307 #定義端口
log-bin=mysql-bin #開啟二進(jìn)制日志
server-id=001 #定義服務(wù)ID
max_allowed_packet=50M ###最大
wait_timeout=3600 ###等待超時默認(rèn)s
interactive_timeout=3600 ###活動超時
innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
# 主從復(fù)制相關(guān)配置
## 復(fù)制過濾:也就是指定哪個數(shù)據(jù)庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
## 為每個session 分配的內(nèi)存谍咆,在事務(wù)過程中用來存儲二進(jìn)制日志的緩存
binlog_cache_size=1M
## 主從復(fù)制的格式(mixed,statement,row,默認(rèn)格式是statement)
binlog_format=mixed
## 二進(jìn)制日志自動刪除/過期的天數(shù)私股。默認(rèn)值為0摹察,表示不自動刪除。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤倡鲸,避免slave端復(fù)制中斷供嚎。
## 如:1062錯誤是指一些主鍵重復(fù),1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
basedir=/home/www/Dev/mysql/mysql_multi #MYSQL根目錄
datadir=/home/www/Dev/mysql/mysql_multi/data_3307 #MYSQL數(shù)據(jù)存放目錄
socket=/home/www/Dev/mysql/mysql_multi/data_3307/3307_mysql.sock #套接字
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8 #定義數(shù)據(jù)庫默認(rèn)字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names = 0 #對表的大小寫不敏感
[mysqld_safe]
log-error=/home/www/Dev/mysql/logs/3307_err.log #錯誤日志
pid-file=/home/www/Dev/mysql/mysql_multi/data_3307/mysqld.pid #pid,多協(xié)議通信 tcp/sock
類似的峭状,3308配置克滴,存放位置 conf/3308.cnf
[client]
default-character-set=utf8 #客戶端連接編碼
[mysql]
auto-rehash #客戶端tab補(bǔ)全
default-character-set=utf8 #編碼
[mysqld]
user=mysql
port=3308 #定義端口
log-bin=mysql-bin #開啟二進(jìn)制日志
server-id=011 #定義服務(wù)ID
max_allowed_packet=50M ###最大
wait_timeout=3600 ###等待超時默認(rèn)s
interactive_timeout=3600 ###活動超時
innodb_buffer_pool_size = 128M
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
# 主從復(fù)制相關(guān)
## 復(fù)制過濾:也就是指定哪個數(shù)據(jù)庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
## 為每個session 分配的內(nèi)存,在事務(wù)過程中用來存儲二進(jìn)制日志的緩存
binlog_cache_size=1M
## 主從復(fù)制的格式(mixed,statement,row优床,默認(rèn)格式是statement)
binlog_format=mixed
## 二進(jìn)制日志自動刪除/過期的天數(shù)劝赔。默認(rèn)值為0,表示不自動刪除胆敞。
expire_logs_days=7
## 跳過主從復(fù)制中遇到的所有錯誤或指定類型的錯誤着帽,避免slave端復(fù)制中斷。
## 如:1062錯誤是指一些主鍵重復(fù)移层,1032錯誤是因為主從數(shù)據(jù)庫數(shù)據(jù)不一致
slave_skip_errors=1062
## relay_log配置中繼日志
relay_log=mysql-relay-bin
## log_slave_updates表示slave將復(fù)制事件寫進(jìn)自己的二進(jìn)制日志
log_slave_updates=1
## 防止改變數(shù)據(jù)(除了特殊的線程)
read_only=1
basedir=/home/www/Dev/mysql/mysql_multi #MYSQL根目錄
datadir=/home/www/Dev/mysql/mysql_multi/data_3308 #MYSQL數(shù)據(jù)存放目錄
socket=/home/www/Dev/mysql/mysql_multi/data_3308/3308_mysql.sock #套接字
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8 #定義數(shù)據(jù)庫默認(rèn)字符 server\collation
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names = 0 #對表的大小寫不敏感
[mysqld_safe]
log-error=/home/www/Dev/mysql/logs/3308_err.log #錯誤日志
pid-file=/home/www/Dev/mysql/mysql_multi/data_3308/mysqld.pid #pid,多協(xié)議通信 tcp/sock
- 初始化數(shù)據(jù)庫
(可能參考1配置的版本比較老仍翰,提示./scripts/mysql_install_db
方式不可取)
./bin/mysqld --defaults-file=conf/3307.cnf --user=www --initialize --basedir=/home/www/Dev/mysql --datadir=/home/www/Dev/mysql/mysql_multi/data_3307
./bin/mysqld --defaults-file=conf/3308.cnf --user=www --initialize --basedir=/home/www/Dev/mysql --datadir=/home/www/Dev/mysql/mysql_multi/data_3308
從啟動中也可以看到观话,具體的目錄予借、配置的存放位置了;需要注意的是频蛔,--defaults-file參數(shù)需要緊跟著./bin/mysqld
,剛開始隨意放了個位置灵迫,居然提示 不認(rèn)識這個選項
- 啟動數(shù)據(jù)庫
./bin/mysqld_safe --defaults-file=conf/3307.cnf &
./bin/mysqld_safe --defaults-file=conf/3308.cnf &
首次啟動后的日志文件中,最后一行包含了臨時root用戶的密碼晦溪,這個需要保持下來瀑粥,例如:
A temporary password is generated for root@localhost: dhtiYkKwt4&O
既然啟動了,就連接試試看唄
./bin/mysql -S /home/www/Dev/mysql/mysql_multi/data_3307/3307_mysql.sock -P 3307 -u root -p
使用啟動時的臨時密碼登錄尼变;
在隨后的show databases
時利凑,報錯:
ERROR 1820(HY000) Unknown error 1820
百度了下浆劲,需要設(shè)置密碼SET PASSWORD=PASSWORD('mima')
,就可以了。
此時參考1中的設(shè)置密碼一步就不再需要了
至此哀澈,單機(jī)多實例就算完成牌借,之后,配置主從同步
- 新建同步的賬號
# 在3307上新建同步的賬號割按,讓3308同步3307的改變
create user 'sync'@'localhost' identified by 'sync';
- 對同步的賬號授權(quán)可以同步的權(quán)利
grant replication slave on *.* to 'sync'@'localhost' identified by 'sync';
-
查看主庫的狀態(tài)
圖3.png 切換到從庫(3308)膨报,讓3308同步3307
change master to master_host='localhost', master_port=3307, master_user='sync', master_password='sync', master_log_file='mysql-bin.000003', master_log_pos=154;
看到如此隨意的change master to .... 開始懷疑參考1的嚴(yán)肅性,查看了其他的博客适荣,發(fā)現(xiàn)也是這樣现柠,那就試試了,還真是的弛矛,執(zhí)行沒報錯的話够吩,show slave status
是這樣
此時還沒開啟同步;
- 開啟同步
# 開啟同步
start slave;
# 停止從主機(jī)
stop slave丈氓;
開啟后周循,show slave status
展示的上圖飄紅部分是YES
,例如:
- 隨后在主庫上新建個庫万俗,創(chuàng)建表湾笛,寫入幾個數(shù)據(jù)看看;
# 新建數(shù)據(jù)庫`webdb`
create databases webdb;
# 新建測試數(shù)據(jù)表 t
create table t(`a` int, `b` int);
# 寫入一行數(shù)據(jù)
insert into t set a=1,b=2;
查看從庫的同步
此時闰歪,可以查看主庫的show master status
和從庫的show slave status
嚎研,其中的position是一致的,也就是主從沒有延遲库倘;
【參考書】
1临扮、https://www.cnblogs.com/xiaochina/p/6886115.html
2、http://www.raye.wang/2017/04/14/mysqlzhu-cong-fu-zhi-da-jian-ji-yu-ri-zhi-binlog
3于樟、http://www.reibang.com/p/63c1a1babfd1