1、下載一個穩定的mysql版本
2、在主庫上,設置一個復制使用的賬戶,并授權replication slave權限。這里創建一個復制用戶rep1,可以從ip為192.168.5.10的主機進行鏈接。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.5.10' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.02 sec)
3、修改主數據庫服務器的配置文件my.cnf,開啟binlog,并設置server-id的值。
配置如下:
[mysqld]
log-bin = /Users/sam/test/log/mysql-bin.log
server_id = 1
4、在主庫上,設置讀鎖定有效,這個操作是為了確保沒有數據庫操作,以便獲得一個一致性快照:
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
5、得到主庫上當前的二進制志名和偏移量值。這個操作是為了在從數據庫啟動以后,從這個點開始進行數據的恢復。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
6、現在主數據庫已經停止了更新操作,我們備份一下數據庫,最快的方式就是直接復制數據文件,備份相信大家都會吧,在這里我們就不多做說明了。
7、數據備份完畢之后,可以恢復寫的操作,然后剩下的只要在從數據庫上做就行好了。
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
8、將備份的數據恢復到從數據庫上。
9、修改從數據庫的my.cnf文件,增加server-id,(server-id是唯一的,從庫的不能和主庫一樣。如果有多個從數據庫,每個server-id都必須唯一)。
在my.cnf配置:
[mysqld]
server_id = 2
10、在從庫上,使用--skip-slave-start選項啟動從數據庫,這樣不會立即啟動從數據庫服務上的復制進程,方便我們對數據庫上的服務進行 進一步的配置
192:bin Ast$ sudo ./mysqld_safe --skip-slave-start &
11、對從數據庫服務器做相應的設置,制定復制使用的用戶,主數據庫服務器的ip,端口以及開始執行復制的日志文件和位置(第5步中的FILE和Position),具體代碼:
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.5.7',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (1.64 sec)
12 、從庫上啟動slave線程:
mysql> start slave;
Query OK, 0 rows affected (0.17 sec)
13、slave上執行 show processlist命令顯示類似如下的進程:
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 9 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 88 | system user | | NULL | Connect | 12 | Connecting to master | NULL |
| 89 | system user | | NULL | Connect | 12 | Slave has read all relay log; waiting for more updates | NULL |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
3 rows in set (0.04 sec)
這表明已經連接上master來,開始接受并執行日志。
在slave上檢查下同步的執行狀態:
show slave status\G
看其中的Slave_IO_Running和Slave_SQL_Running的狀態是否yes,不是的話則出錯了。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.5.7
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 768
Relay_Log_File: 192-relay-bin.000002
Relay_Log_Pos: 934
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
***
1 row in set (0.00 sec)
到此為止,所有的復制工作我們都已做完了。
在主數據創建數據庫表并插入數據查看是否同步。
如果因為某種操作或服務器蕩機導致復制失敗Slave_SQL_Running: No
解決 Slave_SQL_Running: No
從數據庫關閉slave線程:
mysql> stop slave;
再次查看主數據庫上File和Position值
mysql> show master status;
記錄下File和Position值,從數據庫上設置
CHANGE MASTER TO
MASTER_HOST='xxxxxxx',
MASTER_USER='xxxxxxx',
MASTER_PASSWORD='xxxxxxx',
MASTER_LOG_FILE='xxxxxxx',
MASTER_LOG_POS=xxxxxxxx;
mysql> start slave;
Query OK, 0 rows affected (0.17 sec)