mysql:master--salve主從庫同步備份"鎖表"操作


在MySQL數據庫中,在進行數據遷移和從庫只讀狀態設置時,都會涉及到只讀狀態和Master-slave的設置和關系。

經過實際測試,對於MySQL單實例數據庫和master庫,如果需要設置為只讀狀態,需要進行如下操作和設置:
將MySQL設置為只讀狀態的命令:
# mysql -uroot -p
mysql> show global variables like "%read_only%";
mysql> flush tables with read lock;
mysql> set global read_only=1;
mysql> show global variables like "%read_only%";

將MySQL從只讀設置為讀寫狀態的命令:
mysql> unlock tables;
mysql> set global read_only=0;


對於需要保證master-slave主從同步的salve庫,如果要設置為只讀狀態,需要執行的命令為:
mysql> set global read_only=1;


將salve庫從只讀狀態變為讀寫狀態,需要執行的命令是:

mysql> set global read_only=0;


對於數據庫讀寫狀態,主要靠 “read_only”全局參數來設定;默認情況下,數據庫是用於讀寫操作的,所以read_only參數也是0或faluse狀態,這時候不論是本地用戶還是遠程訪問數據庫的用戶,都可以進行讀寫操作;如需設置為只讀狀態,將該read_only參數設置為1或TRUE狀態,但設置 read_only=1 狀態有兩個需要注意的地方:
      1.read_only=1只讀模式,不會影響slave同步復制的功能,所以在MySQL slave庫中設定了read_only=1后,通過 show slave status\G 命令查看salve狀態,可以看到salve仍然會讀取master上的日志,並且在slave庫中應用日志,保證主從數據庫同步一致;
      2.read_only=1只讀模式,可以限定普通用戶進行數據修改的操作,但不會限定具有super權限的用戶的數據修改操作;在MySQL中設置read_only=1后,普通的應用用戶進行insert、update、delete等會產生數據變化的DML操作時,都會報出數據庫處於只讀模式不能發生數據變化的錯誤,但具有super權限的用戶,例如在本地或遠程通過root用戶登錄到數據庫,還是可以進行數據變化的DML操作;


為了確保所有用戶,包括具有super權限的用戶也不能進行讀寫操作,就需要執行給所有的表加讀鎖的命令 “flush tables with read lock;”,這樣使用具有super權限的用戶登錄數據庫,想要發生數據變化的操作時,也會提示表被鎖定不能修改的報錯。

 

這樣通過 設置“read_only=1”和“flush tables with read lock;”兩條命令,就可以確保數據庫處於只讀模式,不會發生任何數據改變,在MySQL進行數據庫遷移時,限定master主庫不能有任何數據變化,就可以通過這種方式來設定。


但同時由於加表鎖的命令對數據庫表限定非常嚴格,如果再slave從庫上執行這個命令后,slave庫可以從master讀取binlog日志,但不能夠應用日志,slave庫不能發生數據改變,當然也不能夠實現主從同步了,這時如果使用 “unlock tables;”解除全局的表讀鎖,slave就會應用從master讀取到的binlog日志,繼續保證主從庫數據庫一致同步。
 

為了保證主從同步可以一直進行,在slave庫上要保證具有super權限的root等用戶只能在本地登錄,不會發生數據變化,其他遠程連接的應用用戶只按需分配為select,insert,update,delete等權限,保證沒有super權限,則只需要將salve設定“read_only=1”模式,即可保證主從同步,又可以實現從庫只讀。


相對的,設定“read_only=1”只讀模式開啟的解鎖命令為設定“read_only=0”;設定全局鎖“flush tables with read lock;”,對應的解鎖模式命令為:“unlock tables;”.
 

當然設定了read_only=1后,所有的select查詢操作都是可以正常進行的。

------------------------------------------------------------------------------------------

以上為鎖表操作,具體主從復制過程如下:

1,准備工作

主數據庫:192.168.34.119   /linux

從數據庫:192.168.34.129  /linux

2,(主庫)修改mysql配置文件

 找到主數據庫的配置文件my.cnf(或者my.ini),我的在/etc/my.cnf,在[mysqld]部分插入如下兩行:

[mysqld]
log-bin=mysql-bin #開啟二進制日志 server-id=1 #設置server-id

2.(主庫)重啟mysql,創建用於同步的用戶賬號

打開mysql會話

mysql>mysql  -uroot -p

創建用戶並授權:用戶:rel1密碼:slavepass

mysql> CREATE USER 'repl'@'123.57.44.85' IDENTIFIED BY 'slavepass';#創建用戶 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'123.57.44.85';#分配權限 mysql>flush privileges; #刷新權限

3.查看master狀態,記錄二進制文件名(mysql-bin.000003)和位置(73):

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 73 | test | manual,mysql | +------------------+----------+--------------+------------------+

二、從服務器slave修改:

1.修改mysql配置

同樣找到my.cnf配置文件,添加server-id

[mysqld]
server-id=2 #設置server-id,必須唯一

2.重啟mysql,打開mysql會話,執行同步SQL語句(需要主服務器主機名,登陸憑據,二進制文件的名稱和位置):

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='182.92.172.80', -> MASTER_USER='rep1', -> MASTER_PASSWORD='slavepass', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=73;

3.啟動slave同步進程:

mysql>start slave;

4.查看slave狀態:

mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 182.92.172.80 Master_User: rep1 Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000013 Read_Master_Log_Pos: 11662 Relay_Log_File: mysqld-relay-bin.000022 Relay_Log_Pos: 11765 Relay_Master_Log_File: mysql-bin.000013 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: ...

當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設置成功了。接下來就可以進行一些驗證了,比如在主master數據庫的test數據庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據即可驗證主從復制功能是否有效,還可以關閉slave(mysql>stop slave;),然后再修改master,看slave是否也相應修改(停止slave后,master的修改不會同步到slave),就可以完成主從復制功能的驗證了。

還可以用到的其他相關參數:

master開啟二進制日志后默認記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的數據庫甚至指定的表的操作,具體在mysql配置文件的[mysqld]可添加修改如下選項:

# 不同步哪些數據庫  
binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema # 只同步哪些數據庫,除此之外,其他不同步 binlog-do-db = game

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM