linux mysql主從複製配置

來源:互聯網
上載者:User

標籤:二進位檔案   線程狀態   不同   mysq   根據   就是   使用者   備份   企業   

1、設定主庫master的servie-id值並且開啟bin-log功能參數
vi /etc/my.cnf
修改my.cnf的參數:
[mysqld]
server-id=1 //每一個庫的server-id必須都不一樣
log-bin=mysql-bin

2、檢查參數是否成功設定並重新啟動
egrep "server-id|log-bin" /etc/my.cnf
重啟命令見:mysql安裝或mysql資料庫多執行個體

3、登入資料庫檢查參數的更改情況
show variables like ‘server_id‘;
show variables like ‘log_bin‘;

4、在主庫上建立用於從庫複製的帳號
從庫要想從主庫複製資料,必須要有一個主庫的帳號允許從庫訪問
mysql -uroot -p‘zjl123‘ 
mysql> grant replication slave on *.* to ‘rep‘@‘10.0.0.%‘ identified by ‘zjl123‘;
mysql> flush privileges;
這裡*.*表示所有資料庫的所有表,也可以指示某個資料庫的某個表
rep 為同步的帳號,10.0.0.% 為授權的主機網段,使用了%表示允許整個10.0.0.0的網段可以訪問rep使用者
replication slave 就是主從複製需要的許可權

5、檢查主庫建立的rep複製帳號是否成功
mysql>select user,host from mysql.user;
mysql>select user,host from mysql.user where user = ‘rep‘;
mysql>show grants for [email protected]‘10.0.0.%‘;

實現對主庫鎖表唯讀,用於備份主庫的資料到從庫,使同步前資料一致,鎖表時如果超過設定時間不操作會自動解鎖
6、資料庫鎖表並查看自動解鎖時間長度參數:
mysql>flush table with read lock;
show variables like ‘%timeout%‘

7、查看主庫當前binlog檔案名稱和備份點,從程式庫要求複製時就從這個點開始
mysql>show master status;
或者
mysql -u root -p ‘zjl123‘ -e "show master status"

鎖表後一定要單開一個SSH視窗,匯出主庫資料,如果資料很大(50G以上),並且允許停機,可以停庫直接打包資料檔案進行遷移,那樣更快。
8、備份主庫資料:
mkdir /server/backup/ -p
mysqldump -u root -p ‘zjl123‘ --events -A -B |gzip >/server/backup/mysql_bak.$(date +%F).sql.gz
ls -l /server/backup/mysql_bak.$(date +F%).sql.gz
或者:
mysqldump -u root -p ‘zjl123‘ --events -A -B -x --master-data=1 |gzip >/server/backup/mysql_bak.$(date +%F).sql.gz
--master-data=1參數會在備份資料裡增加如下語句
--position to start replication or point -in-time recovery from change master to master_log_file=‘mysql-bin-000005‘,master_log_post=107;
此時從庫在change master 時就無需指定binlog檔案名稱和位置了,因為在備份時已經備份了該語句

9、為了確保匯出資料期間資料庫沒有資料插入,導庫完畢時可以再次檢查主庫的狀態資訊,結果如下:
mysql -u root -p ‘zjl123‘  -e "show master status"
若無特殊情況,binlog檔案及位置點和鎖表後匯出資料前是一致的

10、開鎖資料庫表
mysql>unlock tables;

以下是從庫上執行的操作
11、設定server-id值並關閉binlog功能
資料庫的server-id一般在一套主從複製體系內是唯一的,這裡從庫的server-id要和主庫及其他的從庫的不同,並且要注釋掉從誤國的binlog參數配置,如果從庫不需要做級聯複製,並且不做備份用,就不需要開啟binlog功能,開啟了反而會增加從庫磁碟的i/o壓力。
但是,有以下兩種情況需要開啟從庫的binlog功能,記錄資料庫更新的sql語句:
1、作為形如:A-->B-->C這樣的級聯同步,中間的B資料庫,就要開啟binlog功能。
2、在從庫需要備份時要開啟binlog功能,因為Database Backup必須要有,全備和binlog日誌,才是完整的備份。

12、把主庫msqldump的資料匯入到從庫
cd /server/backup/
ls -l
ll
mysql -uroot -p‘zjl123‘ -S /data/3307/mysql.sock < mysql_bak.2015-07-27.sql
提示:如果備份時用了-A參數,則在還原到3307的時候,登入3307執行個體的密碼也會和3306主庫的一致,因為3307執行個體的授權表mysql也被覆蓋了。

13、登入3307資料庫後,配置複製參數
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.7‘, #主庫的IP
MASTER_PORT=3306,#主庫的連接埠
MASTER_USER=‘rep‘,#主庫上建立的用於複製的使用者rep
MASTER_PASSWORD=‘zjl123‘,#rep的密碼
MASTER_LOG_FILE=‘mysql-bin.000008‘,#binlog二進位檔案 的名稱
MASTER_LOG_POS=342;#binlog二進位檔案 的位移量,即複製開始點

以上命令需要登入mysql之後在mysql裡執行

也可以通過不登入資料庫的內部命令列實現,如在命令列中輸入命令如下:
mysql -uroot -p‘zjl123‘ -S /data/3307/mysql.sock<< EOF
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.7‘,
MASTER_PORT=3306,
MASTER_USER=‘rep‘,
MASTER_PASSWORD=‘zjl123‘,
MASTER_LOG_FILE=‘mysql-bin.000008‘,
MASTER_LOG_POS=342;
EOF

上述的操作原理是把使用者、密碼、主庫連接埠、IP等資訊寫入從庫的master.info檔案中。
查看寫入結果如下:
ll /data/3307/data/master.info
cat /data/3307/data/master.info

14、啟動從庫同步開關,並查看同步狀態
mysql -uroot -p‘zjl123‘ -S /data/3307/mysql.sock -e "start slave;"
mysql -uroot -p‘zjl123‘ -S /data/3307/mysql.sock -e "show slave status\G;"

主從複製是否成功主要看以下3項的狀態
mysql -uroot -p‘zjl123‘ -S /data/3307/mysql.sock -e "show slave status\G;"|grep "IO_Running|SQL_Running|_Behind_Master"
分別應該顯示的內容為: yes yes 0

Slave_IO_Running: yes 這個是IO線程狀態,IO線程負責從從庫到主庫讀取binlog日誌,並寫入從庫中繼日誌,狀態為yes表示IO線程工作正常。

Slave_SQL_Running: yes 這個是SQL線程狀態,SQL線程負責讀取中繼日誌(relay-log)中的資料並轉換為SQL語句應用到從資料庫中,狀態為yes表示sql線程工作正常。

Seconds_Behind_Master: 0,這個是複製過程中從庫比主庫延遲的秒數,這個參數很重要,但企業時更準確的判斷主從複寫延遲的方法為:在主庫寫時間戳記,然後從庫讀取時間戳記,和當前資料庫時間進行比較,從而認定是否有延遲。

以上是主從複製的全部內容,測試主從複製,只需要在主庫做修改操作,查看從庫中是否做出了相同的改變即可。


15、查看mysql主從複製I/O線程狀態
mysql>show processlist\G

16、問題一
當主庫語句在從庫執行時產生了衝突時,比如主庫建立了一張表,從庫已經存在該名稱的表,就會建立不成功,這時候,主從同步就無法繼續進行
解決:
show slave status\G
stop slave;#臨時停止同步形狀
set global sql-slave-skip-counter=1;#將同步指標移動一個,如果還不能同步,可以重複該操作
start slave;
set global sql-slave-skip-counter=n;#n>0,忽略執行n個更新
解決二:
可以根據錯誤號碼事先在設定檔中配置,跳過指定的不影響業務資料的錯誤,例如:
grep slave-skip /data/3306/my.cnf
slave-skip-errors = 1032,1062,1007

17從庫需要記錄binlog日誌的方法:
在從庫的my.cnf中加入如下參數,然後重啟服務即可
log-slave-updates#必須要有這個參數
log-bin=/data/3307/mysql-bin
expire_logs_days=7#相當於find /data/3307/ -type f -name " mysql-bin.000*" -mtime +7 | xargs rm -f

 

linux mysql主從複製配置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.