數據庫讀法約定:
主庫: master
從庫: slave
mysql 主從同步的原理:
#主從是異步模式,且是由從庫找主庫進行同步;
1、主庫開啓IO線程; 開啓binlog;
#binlog記錄用戶的增刪改
從庫開啓IO線程; 開啓SQL線程;
2、主庫授權從庫同步的帳號密碼;
3、備份主庫數據且導入從庫;
4、在從庫change master to 導入用於同步主庫的ip、port、user、等信息。
CHANGE MASTER TO
MASTER_HOST='10.0.0.%',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=330;
5、start slave 開啓從庫;
6、從庫的IO線程向主庫的IO線程發起請求;
主庫的IO線程驗證請求從庫的賬戶、密碼等信息是否合法;
主庫返回從庫請求的數據(file 、pos);
7、從庫IO接受到主庫的log日誌後,將log寫入中繼日誌relay-log;
從庫SQL線程讀取relay.log轉換後寫入從庫;
#如果是級聯,從庫需記錄logbin
從庫master.info記錄從庫跟新的位置點;
8、從庫IO線程繼續向主庫請求上一次位置點往下的binlog數據.....
mysql主從同步的步驟:
1)、準備兩臺數據庫環境,或者單臺多實例環境,可以正常啓動和登錄。
2)、配置my.cnf文件。主庫配置log-bin和server-id 參數,從庫配置server-id,id不可以和主庫及其它從庫一樣,從庫一般不開啓log-bin功能,注意重啓生效,(從庫在備份、級聯時開啓binlog);
vi /etc/my.cnf
49 log-bin=mysql-bin
46 server-id = 1
#以上兩個參數要放在my.cnf中的[mysqld]模塊下,否則會出錯;
查看:egrep -E "server-id|log-bin" /etc/my.cnf
server-id = 1
log-bin=mysql-bin
生效查看:
А、ll ../mysql/data/下是否有mysql-bin.000005日誌生成;
Β、mysql -uroot-p123456 -e "show variables like 'log_bin';"
觀察:| log_bin | ON | 是否爲ON
#如果從庫是中繼需開啓binlog、開啓log_slave_updates則可以寫入。
3)、登錄主庫增加用於從庫連接主庫同步的帳號,例如:rep授權replicattion slave的權限;
grant resplication slave on *.* to"rep"@"10.0.0.%" identified by "123456";
刷新權限:
flush privileges;
##replication slave爲mysql同步的必須權限,此處不要授權all;
##*.*表示所有庫所有表,可以指定具體的庫和表進行復制
##"rep"@"10.0.0.%" rep爲同步帳號。10.0.0.%爲授權的網段,使用%表示整個10.0.0.0網段以rep用戶訪問;
4)、主庫登錄,整庫鎖表;然後查看binlog的位置狀態;
flush table with read lock;
#窗口關閉後及失效,超時參數到了也失效)
mysql> show masterstatus;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000022 | 107 | | |
+------------------+----------+--------------+------------------+
注意:flush tables with read lock 5.1
Flush table with readlock 5.5
mysql-bin.000022=file 107=pos
5)、新開窗口,linux命令行備份或導出原有數據庫的數據,並拷貝到從庫所在的服務目錄;
mysqldump -uroot -p123456 -B -A--master-data=1 --events --single-transaction >/back/my.back
#備份,如果數據量很大,允許停機,可以停機打包,而不用mysqldump;
6)、解鎖主庫,unlock tables;
或者--master-data=1
7)、把主庫導出的原有數據恢復到從庫。
8)、根據主庫的show master status;查看binlog的位置狀態,在從庫執行changemaster to 語句;
CHANGE MASTER TO
MASTER_HOST='10.0.0.8',
#主庫的ip地址;
MASTER_PORT=3306,
#主庫mysql的端口;
MASTER_USER='rep',
#主庫允許從庫備份的帳號
MASTER_PASSWORD='123456',
#允許帳號的密碼,
MASTER_LOG_FILE='mysql-bin.000018',
#mysql-bin的位置;
MASTER_LOG_POS=330;
CHANGE MASTER TO
MASTER_HOST='10.0.0.%',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=330;
9)、從庫開啓同步開關:
start slave;
10)、從庫檢查同步狀態,並在主庫進行跟新操作;
Show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
爲正常
線程的啓動與關閉:
停止MYSQL同步
STOP SLAVE IO_THREAD; #停止IO進程
STOP SLAVE SQL_THREAD; #停止SQL進程
STOP SLAVE; #停止IO和SQL進程
啓動MYSQL同步
START SLAVE IO_THREAD; #啓動IO進程
START SLAVE SQL_THREAD; #啓動SQL進程
START SLAVE; #啓動IO和SQL進程
RESET SLAVE; #重置MYSQL同步
# 用於讓從服務器忘記其在主服務器的二進制日誌中的複製位置, 它會刪除master.info和relay-log.info文件,以及所有的中繼日誌,並啓動一個新的中繼日誌,當你不需要主從的時候可以在從上執行 這個操作。不然以後還會同步,可能會覆蓋掉你的數據庫,我以前就遇到過這樣傻叉的事情。哈哈!