1.系統版本都是rhel5 mysql版本相同
2.主服務器正在運行,不能停止。
3.主服務器IP爲:192.168.2.210
從服務器IP爲:192.168.2.220
4.從服務器MSYQL slave 爲停止狀態
配置步驟:
1、主庫創建/etc/my.cnf,修改[mysqld]裏邊的鍵值增加
server-id=1
log-bin=binlog_name
2、主庫增加用戶,用於從庫讀取主庫日誌。
grant replication slave,reload,super on *.* to'slave'@'192.168.2.220'identified by '123456';
flush privileges;
3、從庫連接主庫進行測試。
mysql -u slave -p -h 192.168.2.210 //master的IP
4、停從庫,修改從庫/etc/my.cnf,增加選項:
[mysqld]
server-id=2
master-host=192.168.2.210
master-user=slave
master-password=123456
5.鎖表
mysql > FLUSH TABLES WITH READ LOCK;
注意:爲了保證FLUSH TABLES語句讓讀鎖定保持有效。(如果退出客戶程序,鎖被釋放)。建立新的SSH連接,然後對主服務器上的數據進行快照。
6.建立快照
tar -cvf data.tar /var/lib/mysql
將壓縮包拷貝過去後解壓縮
也可以用scp拷貝過去:
scp -r /var/lib/mysql/* 192.168.2.210:/var/lib/mysql/
注意拷貝過去後權限的設置
chown -R mysql.mysql /var/lib/mysql
數據量大可以用mysqldump導出.
7.解鎖
mysql > UNLOCK TABLES;
8.記下file pos值
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時,讀取主服務器上當前的二進制日誌名(file)和偏移量值(pos):
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
File列顯示日誌名,而Position顯示偏移量。在該例子中,二進制日誌值爲mysql-bin.003,偏移量爲73。記錄該值。以後設置從服務器時需要
使用這些值。它們表示複製座標,從服務器應從該點(也可以是任何點)開始從主服務器上進行新的更新。
9.從服務器執行同步
# mysql>start slave;
# mysql>load data from master;
10.驗證配置
登錄從服務器輸入如下命令:
mysql> show slave status\G;
會得到類似下面的列表:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
都爲yes,則配置正確.
11.進行測試:
主庫創建表,
mysql>create database sampdb;
mysql>use sampdb;
mysql>create table new (name char(20),phone char(20));
mysql>insert into new (’abc‘,’0532555555’);
主從服務器重啓;
打開從庫,查看:
#mysql -u root -p
mysql>show databases; //應該能看到master創建的庫sampdb
mysql
sampdb
test
mysql>use sampdb;
mysql>show tables;
new
說明主從數據庫創建成功。
附:
一些錯誤信息的處理,主從服務器上的命令,及狀態信息。
在從服務器上使用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//已經連上
主服務器上的相關命令:
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命令:(需要在mysql命令行界面或query )
* stop slave #停止同步
* start slave #開始同步,從日誌終止的位置開始更新。
* SET SQL_LOG_BIN=0|1 #主機端運行,需要super權限,用來開停日誌,隨意開停,會造成主機從機數據不一致,造成錯誤
* SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n # 客戶端運行,用來跳過幾個事件,只有當同步進程出現錯誤而停止的時候纔可以執行。
* RESET MASTER #主機端運行,清除所有的日誌,這條命令就是原來的FLUSH MASTER
* RESET SLAVE #從機運行,清除日誌同步位置標誌,並重新生成master.info
雖然重新生成了master.info,但是並不起用,最好,將從機的mysql進程重啓一下,
* LOAD TABLE tblname FROM MASTER #從機運行,從主機端重讀指定的表的數據,每次只能讀取一個,受timeout時間限制,需要調整timeout時間。執行這個命令需要同步賬號有 reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值
* LOAD DATA FROM MASTER #從機執行,從主機端重新讀入所有的數據。執行這個命令需要同步賬號有reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值
* CHANGE MASTER TO master_def_list #在線改變一些主機設置,多個用逗號間隔,比如
CHANGE MASTER TO
MASTER_HOST='master2.mycompany.com',
MASTER_USER='replication',
MASTER_PASSWORD='bigs3cret'
* MASTER_POS_WAIT() #從機運行
* SHOW MASTER STATUS #主機運行,看日誌導出信息
* SHOW SLAVE HOSTS #主機運行,看連入的從機的情況。
* SHOW SLAVE STATUS (slave)
* SHOW MASTER LOGS (master)
* SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [ LIMIT [offset,] rows ]
* PURGE [MASTER] LOGS TO 'logname' ; PURGE [MASTER] LOGS BEFORE 'date'