Mysql雙機備份方案
文章分類:數據庫
運行環境:
虛擬機安裝的是CentOS5
Mysql版本:5.1.31- log MySQL Community Server (GPL)
操作步驟:
1. 在主從服務器上分別安裝mysql
shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s full-path-to-mysql-VERSION-OS mysql shell> cd mysql shell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql & |
2. 配置主服務器
2.1 先登錄主機(59.57.251.56)
mysql>grant all on *.* to root@'%' identified by '1234'; -- 添加權限(賦予從機權限,有多臺叢機,就執行多次) mysql>GRANT All ON *.* TO 'backup'@'%' IDENTIFIED BY 'testbak'; mysql>flush privileges; -- 刷新權限 mysql>select host,user from user; --查看權限 |
2.2 打開主機A的my.cnf,輸入
server-id = 1 # 主機標示,整數 log_bin = /var/log/mysql/mysql-bin.log #確保此文件可寫 read-only =0 #主機,讀寫都可以 binlog-do-db =test #需要備份數據,多個寫多行 binlog-ignore-db=mysql #不需要備份的數據庫,多個寫多行 |
2.3 打開從機B的my.cnf,輸入
server-id =2 log_bin =/var/log/mysql/mysql-bin.log master-host =59.57.251.56 master-user =backup master-pass =testbak master-port =3306 master- connect-retry=60 #如果從服務器發現主服務器斷掉,重新連接的時間差(秒) replicate-do-db =test #只複製某個庫 replicate-ignore-db=mysql #不復制某個庫 |
3. 主從數據同步
有多種方法:
1) 先mysqldump導出主機A的數據test爲 test.sql
然後在從機B上建立數據庫test,mysql導入 test.sql到test庫中
2) 如果你想使用複製數據文件的方式來備份數據庫
只要在從服務器上的mysql命令行先鍵入slave stop;然後複製數據庫文件,複製好了,再在mysql命令行鍵入slave start;啓動從服務器,這樣就即備份了數據有保證了數據完整性,而且整個過程中主服務器的mysql無需停止。
4. 先重啓主機A的 mysql,再重啓從機B的mysql
If you get this error File '/var/log/mysql/mysql-bin.index' not found (Errcode: 13) you might want to try and chown -R mysql:mysql /var/log/mysql
5. 驗證
在主機A中,mysql>show master status/G;
在從機B 中,mysql>show slave status/G;
能看到大致這些內容
Position: 1374
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
mysql> show slave status/G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.139.77 Master_User: backup Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 106 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: test Replicate_Ignore_DB: mysql Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 410 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) |
可以在主機A中,做一些INSERT, UPDATE, DELETE 操作,看看主機B中,是否已經被修改
6. 相關注意事項
提示:如果修改了主服務器的配置,記得刪除從服務器上數據庫目錄下的master.info文件。否則從服務器使用的還是老配置,可能會導致錯誤。
----------------------------------------------------------------------
注意: 關於要複製多個數據庫時,binlog-do-db和replicate-do-db選項的設置,網上很多人說是用半角逗號分隔,經過測試,這樣的說法是錯
誤的,MySQL官方文檔也明確指出,如果要備份多個數據庫,只要重複設置相應選項就可以了。
比如:
binlog-do-db=a binlog-do-db=b replicate-do-db=a replicate-do-db=b |
-----------------------------------------------------------------------
補充:
在從服務器上使用show slave status/G
Slave_IO_Running, 爲No,
則說明IO_THREAD沒有啓動,請執行start slave io_thread
Slave_SQL_Running爲 No
則複製出錯,查看Last_error字段排除錯誤後執行start slave sql_thread
查看 Slave_IO_State字段空 //複製沒有啓動
Connecting to master//沒有連接上master
Waiting for master to send event// 已經連上
補充: 可以使用LOAD DATA FROM MASTER語句來建立 slave。但有約束條件:
數據表要全部是MyISAM表,必須有SUPER權限,master的複製用戶必須具備RELOAD和SUPER權限。
在master端執行RESET MASTER清除已有的日誌變更,
此時slave端會因爲找不到master日誌無法啓動 IO_THREAD,請清空data目錄下
relay-log.info,hosname-relay-bin*等文件重新啓動mysql
中繼日誌文件默認的文件爲hostname-relay-bin.nnn和hostname-relay-bin.index。可用從服務器的--
relay- log和--relay-log-index選項修改。在從服務器中還有一個relay-log.info中繼信息文件,可用
--relay- log-info-file啓動選項修改文件名。
雙機互備則是兩個mysql同時配置爲master及slave
++主服務器上的相關命令
show master status show slave hosts show logs show binlog events purge logs to ‘log_name’ purge logs before ‘date’ reset master(老版本flush master) set sql_log_bin= |
++從服務器上的相關命令
slave start slave stop SLAVE STOP IO_THREAD //此線程把master段的日誌寫到本地 SLAVE start IO_THREAD SLAVE STOP SQL_THREAD //此線程把寫到本地的日誌應用於數據庫 SLAVE start SQL_THREAD reset slave SET GLOBAL SQL_SLAVE_SKIP_COUNTER load data from master show slave status(SUPER,REPLICATION CLIENT) CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= // 動態改變master信息 PURGE MASTER [before 'date'] 刪除master端已同步過的日誌 |
++ 產生了mysql-bin.00000x文件可以刪除