爲什麼要複製數據庫?
簡單來說有以下幾個用處:
- 讀寫分離
通過MySQL複製可以實現讀寫分離,將讀操作分佈到多個不同的服務器上,減輕服務器的壓力。 - 備份
從庫可以作爲數據的異地實時備份。 - 故障切換
當主庫遇到故障,系統可以切換到從庫,實現故障切換。 - 升級測試
從庫可作爲測試服務器的數據庫。
主從複製圖示如下:
複製數據的步驟
- 在主庫上把數據更改記錄到二進制日誌(Binary Log)中。
- 備庫將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
- 備庫讀取中繼日誌中的事件,將其在備庫上重新執行一遍。
具體操作步驟如下:
主服務器地址:10.145.1.17
從服務器地址:10.145.1.22
分別登錄主從服務器上的MySQL
在主從服務器上分別新建數據庫sync
這樣主從服務器上都新建了一個新的數據庫sync。
創建複製賬號repl,並賦予replication slave權限
create user ‘repl’@‘10.145.1.%’ identified by ‘Repl123!@#’;
grant replication slave on . to ‘repl’@‘10.145.1.%’;
修改主備數據庫的配置文件
主服務器配置
用命令 whereis my.cnf 找到my.cnf文件的位置,然後用vim打開
在文件中添加:
log_bin = mysql-bin
server_id = 17
這裏的log_bin爲日誌文件名,自己取一個名詞, server_id 只要唯一就行
systemctl restart mysqld 重啓mysql
重新登錄mySQL
輸入命令show master status;
可以看到file那一列變成了mysql-bin.000001,配置成功。
從服務器配置
退出mysql,找到並編輯my.cnf文件
添加以下內容:
log_bin = mysql-bin
server_id = 22
relay_log = /var/lib/mysql/mysql-realay-bin
log_slave_updates = 1
read_only = 1
log_bin默認情況下會使用機器名命名,這裏設成和主庫相同的名稱,當然也可以設置成其他名稱。
relay_log指定中繼日誌的位置和名字,log_slave_updates允許備庫將其重放事件記錄到自身的二進制文件中,read_only會阻止沒有權限的線程修改數據。
這裏其實只有server_id是必填項,其他都是選填的。
保存好配置文件後,重啓mysql
重新進入MySQL,使用change master to命令開始複製:
change master to master_host=‘10.145.1.17’,
master_user = ‘repl’,
master_password = ‘Repl123!@#’,
master_log_file = ‘mysql-bin-000001’,
master_log_pos = 0;
輸入命令show slave status\G;查看狀態
圖中顯示:
Slave_IO_Running: No
Slave_SQL_Running: No
表示當前備庫還沒有開始複製。
輸入命令:start slave;開始複製。
圖中顯示:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Connecting說明還未連接成功。
哪裏出問題了呢?
用show grants for ‘repl’@‘10.145.1.%’;命令查看,權限已經授予成功了。
查一下mysql日誌
vim /var/log/mysqld.log
最下面顯示
Could not find first log file name in binary log index file
在網上搜了一下,在主服務器上運行flush logs;後查看最新的bin-log變成了mysql-bin.000002。
在從服務器上執行
發現還是不行。
到底哪裏出了問題呢???
我查了好久,心力憔悴啊,終止發現了問題!
我把mysql-bin.000002寫成了mysql-bin-000002!我去,心好累啊。。。
重新設置,這次終於成功了!
哎,不容易啊。
在主數據庫上運行 show processlist\G;
顯示了來自10.145.1.22的連接,並等待更多的更新。
在從數據庫上 show processlist\G;
顯示等待主服務器的數據。
好了,現在我們來驗證一下:
剛開始都沒數據,在主數據庫上建表,並插入數據:
從數據庫同步了數據:
第一次show tables沒數據,第二次show tables的時候已經同步了主數據庫上的數據,也就有了數據。
自此主從複製設置完成,最後感慨一句,做程序員,細心真的很重要啊。。。