數據庫主從復制原理:
數據庫的主從復制就是從master數據庫復制到slave數據庫,在master與slave之間實現整個復制需要三個線程來完成,其中兩個在slave端一個在master端。
在master端必須打開binlog功能,因為從數據庫需要獲得主數據的完整的操作日志然後再自身上順序的執行日志中的各種操作。
主要步驟:
1、將slave的io線程連上master,請求獲得指定日志文件的指定位置之後的操作日志的內容;
2、master獲得slave的io線程請求後,將請求中讀取到的指定日志的指定位置之後的內容返回給slave端的io線程,其中包括binlog 的位置以及名稱;
3、slave端的io線程在接收到信息後,將接收到的日志內容寫入slave端的relay log文件的末端,並將binlog的文件名和位置記錄到master-info文件中,以便下一次請求時向master提出請求;
4、slave的sql線程會檢測到relay log中新增的一些日志內容並加以解析成為可執行的query語句在slave端執行,從而達到master與slave端的數據一致性。
配置方法:
MASTER
1、編輯master的配置文件/etc/my.cnf,在[mysqld]中添加以下內容:
log-bin=mysql-bin #打開mysql的操作日志功能
binlog_format=mixed #主從復制模式,混合模式(MBR)默認的
binlog_cache_size=4M #設置binlog緩存大小
max_binlog_size=300M #設置binlog文件大小,如果不設置,默認是1.1GB
expire_logs_days= 3 #bin-log在主庫保存的天數,主庫產生的bin-log並不會自動刪除,需要手動刪除
2、在master上對從數據庫進行授權,建立復制用戶的專有賬戶
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repl’@'%’ IDENTIFIED BY ‘repl’;
3、對master的數據庫進行備份
在備份master數據時要對master執行鎖表操作:
mysql>FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master; //刷新數據庫
Query OK, 0 rows affected (0.00 sec)
在不退出該終端的情況下(否則鎖表會失效),再次開啟一個終端直接打包壓縮數據文件或者使用mysqldump工具來導出數據:
#mysqldump -uroot -h 127.0.0.1 –opt -R XXXXXX > /data/mysql/backup/XXXXXX.sql
#cd/data/mysql/backup/
4、備份數據庫到從數據庫
#tar -czvf XXXXXX.tar.gz XXXXXX.sql
#scp XXXXXX.tar.gz [email protected]:/data/mysql/backup
可用相同的方法將數據庫導入到其他的slave機器上,導入完成後在Master的命令終端上執行一下解鎖命令:
mysql>UNLOCK TABLES;
mysql>show processlist;
mysql>show master statusG; #查看主服務器的bin-log 和id
5、設置slave主機
編輯slave從數據庫的/etc/my.cnf配置文件,前面的配置參數與主的一樣,都是根據硬件內存進行參數調整:
#binlog_format=mixed
#required unique id between 1 and 2^32 – 1
#defaults to 1 if master-host is not set
#but will not function as a master if omitted
server-id=2 //slave 的編號 注意不要重復
read_only=1
binlog_format=mixed
binlog_cache_size=4M //設置binlog緩存大小
max_binlog_size=300M //設置binlog文件最大體積
在slave主機上新建一個數據庫,導入主數據庫的數據:
mysql>create database XXX;
mysql>use XXX;
mysql>set names utf8;
mysql>source /XXXXXX/XXX.sql
設置從數據庫的主master:
mysql>CHANGE MASTER TO MASTER_HOST=’XX.XX.XX.XX’, //主數據庫的ip地址
->MASTER_USER=’repl’,
->MASTER_PASSWORD=’repl’,
->MASTER_LOG_FILE=’mysql-bin.000001′, //這裡根據主服務器的binlog和id設置
->MASTER_LOG_POS=107; //
設置完成後,開啟slave服務:
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave statusG; //顯示slave的狀態
從輸出結果中若:Slave_IO_Running和Slave_SQL_Running如果都為Yes時,表示配置成功
在線添加多個從庫:
原理:若直接在主數據庫上再次添加從庫會執行停止mysql 的服務進行鎖表操作從而影響正常的工作流程,
故在線添加從數據庫可以通過備份舊的從數據庫達到數據庫復制的目的。再次利用change master 可達到在線添加從數據庫的目的。