1、主從複製的原理:
*Master,記錄數據更改操作
- 啓用binlog記錄模式
- 允許Slave讀取binlog日誌
*Slave運行2個同步線程
- Slave_IO:負責連接Master,複製其binlog日誌文件到本機的relay-log文件
- Slave_SQL:執行本機relay-log文件裏的SQL語句,重現Master的數據操作
2、基本構建思路:
1)初始化現有庫:將主庫導入從庫,確保數據一致性
2)配置Master,主服務器:調整運行參數,授權一個同步用戶
3)配置Slave,從服務器:調整運行參數,發起同步操作
3、初始化現有庫:
**從數據庫服務器上一定要有主數據庫服務器的庫和表,但主數據庫服務器上不需要必須有從數據庫服務器上的庫和表。從服務器應包括希望同步的所有庫,對採用MyISAM的庫,可離線備份。
mysql>reset master; //重置binlog日誌
[root@svr~]#mysqldump -uroot -p123 -B mysql test db6000 >/dbbak/threedb.sql //完整備份主服務器數據庫文件
對於從服務器,離線導入由主服務器提供的備份,清空同名庫(若有的話)
Mysql>drop database test;
[root@pc~]#scp svr:/dbbak/threedb.sql /root/ //遠程拷貝主服務器備份文件
[root@pc~]#mysql -uroot -p123 <threedb.sql //恢復主服務器的備份文件到本機數據庫
**從數據庫服務器如果是克隆的虛擬機的話要修改下面文件uuid的值
[root@localhost mysql]# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=a1c22f29-7d1a-11e4-b7f9-099e0022adfD
4、配置主服務器:
1)調整運行參數,啓用binlog及允許同步
[root@svr~]#vim /etc/my.cnf
[mysqld]
Log_bin //啓用binlog日誌
Server_id=6 //指定服務器ID號,標識自己身份,一般使用IP地址主機位
Innodb_flush_log_at_trx_commit=1 //優化設置
Sync-binlog=1 //允許日誌同步
……
[root@svr~]#service mysql restart //重啓服務,使設置生效
2)授權備份用戶:允許slaveuser從192.168.4.0/24網段訪問,對所有庫(默認不允許對單個庫)有同步權限
mysql>grant replication slave on *.* to slaveuser@”192.168.4.%” identified by “123”;
3)查看主服務器狀態,記住當前的binlog日誌文件名、偏移量pos點號
mysql>show master status\G; //查看當前正在使用的binlog日誌文件名和偏移量 pos點號
file:svr6-bin.000003 //日誌文件名
position:335 //偏移量
……
5、配置從服務器:
1)調整運行參數,啓用binlog及允許同步,啓用只讀模式
[root@pc~]#vim /etc/my.cnf
[mysqld]
log_bin //啓用binlog日誌
server_id=20 //指定服務器ID號
Innodb_flush_log_at_trx_commit=1 //優化設置
sync-binlog=1 //允許日誌同步
read_only=1 //只讀模式
……
[root@pc~]#service mysql restart //重啓服務,使設置生效
2)發起同步操作,指定主服務器相關參數
[root@pc~]#mysql -uroot -p123
mysql> show slave status;
mysql>change master to master_host="192.168.4.6",
master_user="slaveuser",
master_password="123456",
master_log_file="svr6-bin.000003", //binlog日誌文件
master_log_pos=335; //偏移量pos點號
mysql> showslave status\G;
slave_IO_Running: No
slave_SQL_Running: No
mysql>start slave; //啓動複製
mysql> show slave status\G; //查看從服務器狀態
slave_IO_Running: YES //IO線程已運行
slave_SQL_Running: YES //SQL線程已運行
6、測試主從同步效果:
在主數據庫服務器本機登錄,建庫建表,從數據庫服務器上有主數據庫服務器上的庫和表,在主數據庫服務器執行插入、更新操作,從服務器有同步更新,就成功了。
7、MySQL數據庫主從同步工作原理:
1)Slave_IO_Running:負責把主數據庫服務器當前正在使用的binlog日誌裏的sql語句,拷貝到本機relaybinlog日誌裏,在master_log_file的文件裏從master_log_pos開始拷貝
Master.info :保存主從關聯信息(change master to……),啓動服務時加載。
pc205-relay-bin.000002 pc205-relay-bin.index relay-log.info
vim /etc/my.cnf
[mysqld]
Relay_log=……
2)Slave_SQL_Running:負責執行本機relaybinlog日誌裏的sql語句,把數據寫進數據庫裏
3)報錯信息:
IO進程出錯:查看狀態時Last_IO_Errno: 0 //錯誤次數
Last_IO_Error: //最後一次出錯信息
IO出錯的情況:
- 連接不上主數據庫服務器(ping iptables selinux 授權 主服務器當前使用的日誌文件和節點指錯(在主服務器使用show master status;查看在從服務器使用change master to ……重新設置,要先停止進程 stop slave;改好後start slave;) )
SQL進程出錯:Last_SQL_Errno: 0
Last_SQL_Error:
SQL出錯的情況:和主數據庫服務器上的庫、表、表結構不一致(把主服務器上的庫、表備份還原到從服務器上)
4)停止從服務器:
stop slave;
刪除Master.info pc205-relay-bin.000002 pc205-relay-bin.index relay-log.info
8、主從同步的結構模式:
1)一主一從:主服務器壞掉訪問從服務器的時候,從服務器的數據沒有備份;從服務器壞掉的時候主服務器的數據也沒有備份裏
2)一主多從:配置時在主服務器上授權多個slave用戶在做從服務器的主機上連接自己;或者授權一個用戶在@“%”所有主機連接自己(不安全)。
3)主從從:配置主從,配置從從(同主從),主服務器和從從服務器不同步,客戶端連接從服務器產生的sql語句記錄到本身的binlog日誌,而拷貝的主服務器的sql語句記錄到relaybinlog日誌裏,從從服務器只讀取從服務器本身binlog日誌。要主服務器和從從服務器同步,要配置從服務器:
Vim /etc/my.cnf
[mysqld]
……
Log-slave-updates //記錄從庫更新,允許鏈式複製(A-B-C)配置後從主服務器同步過來的日誌即寫到relaylog裏也寫到自己的binlog日誌裏,以便自身的從服務器根據binlog讀取日誌以同步數據
……
4)主主結構:互爲主從
9、僅需要從服務器備份主服務器的某個或某些庫:
授權時不可以僅對某庫授權,replicationslave授權必須時全局授權
**在配置主從同步時,在主數據庫服務器上設置讓從數據庫服務器如何備份自己的庫:
Vim /etc/my.cnf
[mysqld]
……
Binlog-do-db=數據庫名 //設置主服務器對哪些庫記binlog日誌,此選項可設置多條,省略時複製所有庫
Binlog-ignore-db=數據庫名 //設置主服務器對哪些庫不記binlog日誌(兩條矛盾,不同時用)
……
**或在配置主從同步時,在從數據庫服務器上設置自己如何備份主數據庫服務器的庫:
Vim /etc/my.cnf
[mysqld]
……
Replicate-do-db=數據庫名 //僅複製指定庫,其他庫將被忽略,此選項可設置多條,省略時複製所有庫
Replicate-ignore-db=數據名 //不復制哪些庫(兩條矛盾,不同時用)
**只在主服務器或從服務器一端設置即可。