天天看點

mysql發生隻讀的原因_mysql 隻讀模式詳解

1、設定隻讀模式(此中模式連super都不能進行寫)

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%";

2、将MySQL從隻讀設定為讀寫狀态的指令:

mysql> unlock tables;

mysql> set global read_only=0;

3、對于需要保證master-slave主從同步的salve庫,如果要設定為隻讀狀态,需要執行的指令為:

mysql> set global read_only=1;

4、将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 statusG 指令檢視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查詢操作都是可以正常進行的