MySQL主從複製

測試環境:
master: CentOS 6.6 (x86_64), MySQL5.6.22
slave: Windows 8(x86_64), MySQL5.6.19
 
相關名詞:主從複製,讀寫分離,數據備份
 
Replication容許將master數據庫的數據複製到多個slave數據庫上,replication默認是異步的,所以slave不須要永久的鏈接到master,slave能夠不在線,一旦slave在線後,會把master最新的數據增量同步下來,replication容許複製整個database,或者某個database,或者某張表。
 
1, 關閉master數據庫,編輯master的/usr/my.cnf,my.ini,增長配置:
[mysqld]
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
重啓mysql
master配置參數
 
2, 關閉slave數據庫,編輯slave的my.ini,增長配置
[mysqld]
server-id=2
#下面4行表示:將slave配置成其它slave的master
#log-bin=mysql-bin
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
#log_slave_updates=1 #slave將複製事件寫入本身的bin-log,這樣slave做爲master的時候,其它slave就能夠根據這些bin-log進行復制
#replicate-ignore-db=test #不要複製test數據庫
#replicate-rewrite-db=db_name_a->db_name_b #在master上針對數據庫db_name_a中的操做會被映射到slave的db_name_b數據庫中的相應表。
重啓mysql
slave配置參數
:--replicate-rewrite-db: Only statements involving tables are affected (not statements such as  CREATE DATABASEDROP DATABASE, and  ALTER DATABASE)
 
3, 在master上建立replication賬號
mysql> 
mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
 
  
mysql> FLUSH PRIVILEGES;
 
4, 獲取master數據庫binary log的名稱和位置
打開第一個master session將數據庫鎖定,只容許讀操做
mysql> FLUSH TABLES WITH READ LOCK;
 
打開另外一個master session, 查看binary log的name、position
mysql > 
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+
SHOW MASTER STATUS;
 
若是你的master數據庫以前沒有使用binary log,這時候你看到的name和postion是空的,則在後面的操做中name='',position=4
 
若是你的數據庫已經有數據了,須要在replication以前就導入到slave中,請保持master讀鎖,使用mysqldump將master的數據導出來並導入到slave數據庫中。具體請參考第5步。
 
若是你的數據庫以前沒有數據,或者你不想要以前的數據了,則能夠釋放master鎖,有2種方式釋放:
1)直接退出第一個session
2)執行:
mysql> UNLOCK TABLES;
而後跳到第7節
 
5, 在master上使用mysqldump建立數據快照
說明:此節的目的是,若是master在replication以前已經有數據了,則須要在replication以前將這些數據從master數據庫中導出,而後導入到slave數據庫;這個操做完成以後就能夠replication了;若是你的master以前沒有數據,則跳過此節。
在master機器的shell上,執行如下命令,將整個db導出到dbdump.db文件中。(加上--master-data則在導出時先鎖定表,而後再導數據,最後釋放鎖)-uroot -p參數可選,是指定master數據庫賬號密碼用的
shell> mysqldump -uroot -p --all-databases --master-data > dbdump.db
6, 將數據導入到slave數據庫
-uroot -p參數可選,是指定slave數據庫賬號密碼用的
shell> mysql -uroot -p < dbdump.db
 
7, 在slave上設置master數據庫鏈接信息
mysql> 
    ->     
    ->     
    ->     
    ->     
    ->     CHANGE MASTER TOMASTER_HOST='master_host_name',master_host_nameMASTER_USER='replication_user_name',replication_user_nameMASTER_PASSWORD='replication_password',replication_passwordMASTER_LOG_FILE='recorded_log_file_name',recorded_log_file_nameMASTER_LOG_POS=recorded_log_position;recorded_log_position
注:重複設定以前須要執行:
mysql> RESET SLAVE;
 
8, 啓動slave線程
mysql> START SLAVE;
 
9, 當你不想replication了,能夠在slave上中止slave線程
mysql> STOP SLAVE;
中止後你也能夠從新start slave,replication機制會自動將這段時間master上的數據更新同步到slave。
 
10, 思考:
在項目中咱們能夠利用replication實現數據庫讀寫分離,從而提高服務器性能。master數據庫用於寫,slave數據庫用於讀。
 
11, 參考資料:
 
12, 
相關文章
相關標籤/搜索