Mysql主從復制以及常見錯誤問題分析
一、主從復制簡介:
1、mysql主從復制原理:
Mysql主從復制的實現,主要依賴於二進制日誌來實現,過程主要是根據把主的MySQL 的數據復制到其它主機( Slave )上。在復制過程中,可以理解為一臺mysql服充當服務器,而其他的mysql服務器充當從服務器,而這種從服務器可以是一個或者是多個。在主從復制過程中,mysql-master會將更新寫入二進制日誌,並維護文件的一個索引以跟蹤日誌循環。開啟的二進制,mysql主服務器就會安裝你配置的二進制文件名生成二進制文件,而這些日誌主要是用來記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置,從服務器接收從那時起發生的任何更新。mysql要做到主從復制,其實是把事務都記錄到二進制日誌上,只需要從服務拿到這份日誌,照著日誌上面的動作施加到自己身上就可以了。這樣就實現了主從復制。
2. MySQL二進制復制類型
Mysql主從的復制可以有三種復制類型,分別是:語句的復制STATEMEN,行的復制ROW和混合類型的復制MIXED,語句的復制顧名思義就是在主服務器上執行的SQL語句,在從服務器上執行同樣的語句,行的復制就是把改變的內容復制過去,而不是把命令在從服務器上執行一遍。默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制,配置,復制類型可以通過binlog_format =在配置文件上配置
3. mysql實現主從復制的目的
Mysql配置主從復制的目的,是為了實現數據的備份,實現數據的高可用性和容錯行
4、實現mysql復制要註意的細節
1)、每臺mysql上都要有唯一的server_id,而且主服務器的id要比所有的從服務器的id要小。
2)、Master 可以有很多 Slave,但每個 Slave 只能有一個 Master
二、mysql主從復制實現
1、配置主從,開啟二進制:
1)Master配置:
#Cat /etc/my.cnf
[mysqld] datadir=/var/lib/mysql log-bin=/var/lib/mysql/log-bin server-id = 1 binlog_format = 'MIXED'
重啟mysql服務:
#systemctl restart mysql
2)Slave配置:
#Cat /etc/my.cnf
[mysqld] datadir=/var/lib/mysql server-id = 3 skip-grant-tables log_slave_updates = 1 read_only = 1
##skip-grant-tables、log_slave_updates和read_only是我額外添加的,可以不添加。只要陪配置server-id就可以了。
#重啟slave服務器
#systemctl restart mysql
2、主庫查看二進制:
先做一個全備份
# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > xiaozhang.sql
進入master查看是否啟用了日誌
mysql> show variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec)
3、主庫創建同步用戶
mysql> GRANT ALL ON *.* TO 'rsync'@'%' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES;
4、主庫上查看數據結點
mysql> show master status; +----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+----------+--------------+------------------+-------------------+ | log-bin.000007 | 120 | | | | +----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
5、從庫上面同步
mysql>CHANGE MASTER TO MASTER_HOST='10.100.10.10',MASTER_USER='rsync',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000007',MASTER_LOG_POS=120; mysql>start slave; ##開啟slave模式
6、查看是否實現同步成功
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.200.6.51
Master_User: rsync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: log-bin.000007
Read_Master_Log_Pos: 120
Relay_Log_File: szthdb02-relay-bin.000002
Relay_Log_Pos: 281
Relay_Master_Log_File: log-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
##可以發現Slave_IO_Running,和Slave_SQL_Running已經都為yes說明主從復制配置成功
三、配置過程常見錯誤分析
1、 Slave_IO_Running為No
查看日誌你會發現有這個錯誤
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
錯誤分析:
出現這個問題一定是,你的MASTER_LOG_FILE的文件名不對。
解決方法:認真核對你的MASTER_LOG_FILE的文件名,看看是否是你在連接的時候多加了個空格。
2、 Slave_SQL_Running為No
錯誤分析:一般是slave機器重起後,事務回滾造成的。
解決辦法:
mysql> stop slave ; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave ;
四、添加備份腳本
腳本的的作用是周一到周五每天做一個增量備份,一個星期做一個全備
#!/bin/bash Mysqldump() { mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /var/lib/mysql/`date +%F"-%H:%M"`.sql } Mysql (){ mysqladmin -uroot -p123456 flush-logs } crontab_dump () { cat /etc/crontab | grep "bash $0 Mysqldump " if [ $? -eq 0 ]; then echo "Task was writen, it will perform the task at 00:00" else echo "0 0 6 * * bash $0 Mysqldump " >> /etc/crontab fi } crontab_dump crontab_ mysqladmin () { cat /etc/crontab | grep "bash $0 Mysql " if [ $? -eq 0 ]; then echo "The port test has been written to the time task, and 00:00 will perform the task" else echo "0 0 1-5 * * bash $0 Mysql " >> /etc/crontab fi } crontab_ mysqladmin ##執行腳本後就基本實現了二進制+增備+全備
五、總結
以上就是我的實現過程,以及遇到問題的解決方法,也許你會認為很簡單,但是但你配置到時候,總是會出現一些小問題,原因就是自己還不夠小心嚴謹。所以以後要多註意才行。
Mysql主從復制以及常見錯誤問題分析