mysql 主從備份的原理:
主服務器在做數據庫操作的時候將所有的操作通過日志記錄在binlog里面,有專門的文件存放。如localhost-bin.000003,這種,從服務器 和主服務配置好關系后,通過I/O線程獲取到這個binlog文件然后寫入到從服務器的relaylog(中繼日志)中,然后從服務器執行從服務器中的sql語句進行數據庫的同步。
實現:
准備:兩台服務器,mysql環境,可以是Windows,Linux,下面是兩台Linux服務器,192.168.3.32(主),192.168.3.31(從)。
1. 配置主服務器上mysql的配置文件,配置文件在/etc/my.cnf
log_bin放開注釋
server-id=1 新增
2. 重啟數據庫
systemctl start mysqld
3. 創建復制用戶並賦權限給從服務器 把主服務的所有東西。
grant replication slave on *.* to 'slave'@'192.168.3.31' identified by 'Pangolin123!';
注:‘slave’是復制數據的用戶名,'Pangolin123!'是密碼。192.168.3.31 可以改成%,表示所有的從服務器都可以。不做限制。
4. 更新權限
flush privileges;
5. 在從服務器上進行配置數據庫
server-id=2
6. 重啟數據庫
systemctl start mysqld
7. 在從服務器上進行從數據庫的復制數據的配置
首先登錄 mysql -uroot -p
stop slave;
change master to master_host='192.168.3.32', master_user='slave',
master_password='Pangolin123!',master_log_file='mysql-bin.000006',
master_log_pos=2060 ;
注:mysql-bin.000006 這個東西需要自己找,在mysql的安裝目錄 /var/lib/mysql下面
start slave;
show slave status \G;
查看是否正常:
這兩個Yes表示正常。
8. 測試。
9. 錯誤總結:
錯誤1:從服務器 show slave status \G; 顯示
Slave_IO_Running:NO
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
我解決的辦法是重啟一下就好了。
重啟之后再mysql的目錄下就可以看到 binlog的生成。
錯誤2
Slave_IO_Running:NO
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
解決方案:在主服務器上進行日志刷新
mysql -uroot -p
flush logs;
show master status;
顯示這個,
然后到從服務器上重新配置binlog文件。
stop slave;
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000003',MASTER_LOG_POS=322;
start slave;
show slave status \G;
錯誤3:
Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'localhost-bin.000002' at 107, the last event read from './localhost-bin.000002' at 123, the last byte read from './localhost-bin.000002' at 126.'
是由於配置錯了binlog文件的開始位置。參考錯誤2 重新配置即可。
主從配置已完,下篇是springboot項目怎么配置讀寫分離。
敬請期待。