千家信息网

mysql只读模式下数据迁移,保证数据一致性

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-slave的设置和关系。经过实际测试,对于MySQL单实例数据库和master库,如果需要设置为只读状态,需
千家信息网最后更新 2026年11月01日mysql只读模式下数据迁移,保证数据一致性

在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-slave的设置和关系。


经过实际测试,对于MySQL单实例数据库和master库,如果需要设置为只读状态,需要进行如下操作和设置:

一般单实例情况下将MySQL设置为只读状态的命令:

# mysql -uroot -pmysql> 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查询操作都是可以正常进行的。




实验一:设置了read_only=1后,远程业务用户进行数据库修改会提示ERROR 1290错误:


 copy(test01@172.32.1.200) [data03]> show tables;  +------------------+  | Tables_in_data03 |  +------------------+  | t01              |  | t02              |  | user             |  +------------------+  3 rows in set (0.00 sec)    (test01@172.32.1.200) [data03]>   (test01@172.32.1.200) [data03]>   (test01@172.32.1.200) [data03]> show global variables like "%read_only%";  +------------------+-------+  | Variable_name    | Value |  +------------------+-------+  | innodb_read_only | OFF   |  | read_only        | ON    |  | tx_read_only     | OFF   |  +------------------+-------+  3 rows in set (0.00 sec)    (test01@172.32.1.200) [data03]>   (test01@172.32.1.200) [data03]>   (test01@172.32.1.200) [data03]> delete from t01 where id1=3;  ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement  (test01@172.32.1.200) [data03]> update t01 set id1=id1+30 where id1=3;  ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement  (test01@172.32.1.200) [data03]> insert into t01(id1,a1,b1) values(9,9,9);  ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement  (test01@172.32.1.200) [data03]>   (test01@172.32.1.200) [data03]> select * from t01;  +-----+------+------+  | id1 | a1   | b1   |  +-----+------+------+  |   1 |    1 |    1 |  |   2 |    2 |    2 |  |   4 |    4 |    4 |  |   5 |    5 |    5 |  |   6 |    6 |    6 |  +-----+------+------+  5 rows in set (0.00 sec)    (test01@172.32.1.200) [data03]>





实验二:设定了全局读写后,具有super权限的用户进行数据修改后,也会提示错误ERROR 1223:



view plain copymysql> use data03;  Reading table information for completion of table and column names  You can turn off this feature to get a quicker startup with -A    Database changed  mysql> show tables;  +------------------+  | Tables_in_data03 |  +------------------+  | t01              |  | t02              |  | user             |  +------------------+  3 rows in set (0.00 sec)    mysql> select * from t01;  +-----+------+------+  | id1 | a1   | b1   |  +-----+------+------+  |   1 |    1 |    1 |  |   2 |    2 |    2 |  |   4 |    4 |    4 |  |   5 |    5 |    5 |  |   6 |    6 |    6 |  +-----+------+------+  5 rows in set (0.00 sec)    mysql>   mysql>  show global variables like "%read_only%";  +------------------+-------+  | Variable_name    | Value |  +------------------+-------+  | innodb_read_only | OFF   |  | read_only        | ON    |  | tx_read_only     | OFF   |  +------------------+-------+  3 rows in set (0.00 sec)    mysql>   mysql>   mysql> insert into t01(id1,a1,b1) values(8,8,8);         Query OK, 1 row affected (0.00 sec)    mysql> update t01 set a1=a1+10 where id1=2;  Query OK, 1 row affected (0.00 sec)  Rows matched: 1  Changed: 1  Warnings: 0    mysql> delete from t01 where id1=4;  Query OK, 1 row affected (0.00 sec)    mysql> select * from t01;  +-----+------+------+  | id1 | a1   | b1   |  +-----+------+------+  |   1 |    1 |    1 |  |   2 |   12 |    2 |  |   5 |    5 |    5 |  |   6 |    6 |    6 |  |   8 |    8 |    8 |  +-----+------+------+  5 rows in set (0.00 sec)    mysql>   mysql> flush tables with read lock;  Query OK, 0 rows affected (0.00 sec)    mysql>   mysql> insert into t01(id1,a1,b1) values(9,9,9);  ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock  mysql>   mysql> update t01 set a1=a1+10 where id1=5;  ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock  mysql>   mysql> delete from t01 where id1=5;  ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock  mysql>   mysql>


实验三:MySQL从库设定read_only=1后主从同步正常,设定表读锁后,不能同步,解除读锁后,主从同步恢复。



copy

  1. mysql>

  2. mysql> show databases;

  3. +--------------------+

  4. | Database |

  5. +--------------------+

  6. | information_schema |

  7. | bitvc |

  8. | data03 |

  9. | ga |

  10. | jiradb |

  11. | meibi |

  12. | meibi02 |

  13. | mysql |

  14. | performance_schema |

  15. | sbtest |

  16. +--------------------+

  17. 10 rows in set (0.00 sec)

  18. mysql>

  19. mysql>

  20. mysql>

  21. mysql> show global variables like "%read_only%";

  22. +------------------+-------+

  23. | Variable_name | Value |

  24. +------------------+-------+

  25. | innodb_read_only | OFF |

  26. | read_only | ON |

  27. | tx_read_only | OFF |

  28. +------------------+-------+

  29. 3 rows in set (0.00 sec)

  30. mysql>

  31. mysql> show slave status\G

  32. *************************** 1. row ***************************

  33. Slave_IO_State: Waiting for master to send event

  34. Master_Host: 172.32.1.200

  35. Master_User: repl

  36. Master_Port: 3307

  37. Connect_Retry: 60

  38. Master_Log_File: mysql-bin.000009

  39. Read_Master_Log_Pos: 5853

  40. Relay_Log_File: huobiDBtest-relay-bin.000002

  41. Relay_Log_Pos: 6016

  42. Relay_Master_Log_File: mysql-bin.000009

  43. Slave_IO_Running: Yes

  44. Slave_SQL_Running: Yes

  45. Replicate_Do_DB:

  46. Replicate_Ignore_DB:

  47. Replicate_Do_Table:

  48. Replicate_Ignore_Table:

  49. Replicate_Wild_Do_Table:

    1. Replicate_Wild_Ignore_Table:


  50. Last_Errno: 0

  51. Last_Error:

  52. Skip_Counter: 0

  53. Exec_Master_Log_Pos: 5853

  54. Relay_Log_Space: 6195

  55. Until_Condition: None

  56. Until_Log_File:

  57. Until_Log_Pos: 0

  58. Master_SSL_Allowed: No

  59. Master_SSL_CA_File:

  60. Master_SSL_CA_Path:

  61. Master_SSL_Cert:

  62. Master_SSL_Cipher:

  63. Master_SSL_Key:

  64. Seconds_Behind_Master: 0

  65. Master_SSL_Verify_Server_Cert: No

  66. Last_IO_Errno: 0

  67. Last_IO_Error:

  68. Last_SQL_Errno: 0

  69. Last_SQL_Error:

  70. Replicate_Ignore_Server_Ids:

  71. Master_Server_Id: 2003307

  72. Master_UUID: 6f68eea7-76e9-11e4-8f99-00221904cd5d

  73. Master_Info_File: /data/mysqldata/3308/data/master.info

  74. SQL_Delay: 0

  75. SQL_Remaining_Delay: NULL

  76. Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

  77. Master_Retry_Count: 86400

  78. Master_Bind:

  79. Last_IO_Error_Timestamp:

  80. Last_SQL_Error_Timestamp:

  81. Master_SSL_Crl:

  82. Master_SSL_Crlpath:

  83. Retrieved_Gtid_Set:

  84. Executed_Gtid_Set:

  85. Auto_Position: 0

  86. 1 row in set (0.00 sec)

  87. mysql>

  88. mysql> flush tables with read lock;

  89. Query OK, 0 rows affected (0.00 sec)

  90. mysql> show slave status\G

  91. *************************** 1. row ***************************

  92. Slave_IO_State: Waiting for master to send event

  93. Master_Host: 172.32.1.200

  94. Master_User: repl

  95. Master_Port: 3307

  96. Connect_Retry: 60

  97. Master_Log_File: mysql-bin.000009

  98. Read_Master_Log_Pos: 6531

  99. Relay_Log_File: huobiDBtest-relay-bin.000002

  100. Relay_Log_Pos: 6016

  101. Relay_Master_Log_File: mysql-bin.000009

  102. Slave_IO_Running: Yes

  103. Slave_SQL_Running: Yes

  104. Replicate_Do_DB:

  105. Replicate_Ignore_DB:

  106. Replicate_Do_Table:

  107. Replicate_Ignore_Table:

  108. Replicate_Wild_Do_Table:

  109. Replicate_Wild_Ignore_Table:

  110. Last_Errno: 0

  111. Last_Error:


    1. Skip_Counter: 0



  112. Exec_Master_Log_Pos: 5853

  113. Relay_Log_Space: 6873

  114. Until_Condition: None

  115. Until_Log_File:

  116. Until_Log_Pos: 0

  117. Master_SSL_Allowed: No

  118. Master_SSL_CA_File:

  119. Master_SSL_CA_Path:

  120. Master_SSL_Cert:

  121. Master_SSL_Cipher:

  122. Master_SSL_Key:

  123. Seconds_Behind_Master: 120

  124. Master_SSL_Verify_Server_Cert: No

  125. Last_IO_Errno: 0

  126. Last_IO_Error:

  127. Last_SQL_Errno: 0

  128. Last_SQL_Error:

  129. Replicate_Ignore_Server_Ids:

  130. Master_Server_Id: 2003307

    1. Master_UUID: 6f68eea7-76e9-11e4-8f99-00221904cd5d


  131. Master_Info_File: /data/mysqldata/3308/data/master.info

  132. SQL_Delay: 0

  133. SQL_Remaining_Delay: NULL

  134. Slave_SQL_Running_State: Waiting for global read lock

  135. Master_Retry_Count: 86400

  136. Master_Bind:

  137. Last_IO_Error_Timestamp:

  138. Last_SQL_Error_Timestamp:

  139. Master_SSL_Crl:

  140. Master_SSL_Crlpath:

  141. Retrieved_Gtid_Set:

  142. Executed_Gtid_Set:

  143. Auto_Position: 0

  144. 1 row in set (0.00 sec)

  145. mysql>

  146. mysql>

  147. mysql> select * from data03.t01;

  148. +-----+------+------+

  149. | id1 | a1 | b1 |

  150. +-----+------+------+

  151. | 1 | 1 | 1 |

  152. | 2 | 2 | 2 |

  153. | 4 | 4 | 4 |

  154. | 5 | 5 | 5 |

  155. | 6 | 6 | 6 |

  156. +-----+------+------+

  157. 5 rows in set (0.00 sec)

  158. mysql>

  159. mysql> unlock tables;

  160. Query OK, 0 rows affected (0.00 sec)

  161. mysql> show slave status\G

  162. *************************** 1. row ***************************

  163. Slave_IO_State: Waiting for master to send event

  164. Master_Host: 172.32.1.200

  165. Master_User: repl

  166. Master_Port: 3307

  167. Connect_Retry: 60

  168. Master_Log_File: mysql-bin.000009

  169. Read_Master_Log_Pos: 6531

  170. Relay_Log_File: huobiDBtest-relay-bin.000002

  171. Relay_Log_Pos: 6694

  172. Relay_Master_Log_File: mysql-bin.000009

  173. Slave_IO_Running: Yes

  174. Slave_SQL_Running: Yes

  175. Replicate_Do_DB:

  176. Replicate_Ignore_DB:

  177. Replicate_Do_Table:

  178. Replicate_Ignore_Table:

  179. Replicate_Wild_Do_Table:

  180. Replicate_Wild_Ignore_Table:

  181. Last_Errno: 0

        Last_Error:                    Skip_Counter: 0        Exec_Master_Log_Pos: 6531                 Relay_Log_Space: 6873                Until_Condition: None                 Until_Log_File:                   Until_Log_Pos: 0             Master_SSL_Allowed: No             Master_SSL_CA_File:              Master_SSL_CA_Path:                 Master_SSL_Cert:               Master_SSL_Cipher:                  Master_SSL_Key:           Seconds_Behind_Master: 0  Master_SSL_Verify_Server_Cert: No                  Last_IO_Errno: 0                  Last_IO_Error:                  Last_SQL_Errno: 0                 Last_SQL_Error:     Replicate_Ignore_Server_Ids:              Master_Server_Id: 2003307             Master_UUID: 6f68eea7-76e9-11e4-8f99-00221904cd5d              Master_Info_File: /data/mysqldata/3308/data/master.info               SQL_Delay: 0            SQL_Remaining_Delay: NULL        Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it             Master_Retry_Count: 86400          Master_Bind:         Last_IO_Error_Timestamp:        Last_SQL_Error_Timestamp:                  Master_SSL_Crl:              Master_SSL_Crlpath:              Retrieved_Gtid_Set:               Executed_Gtid_Set:               Auto_Position: 0  1 row in set (0.00 sec)    mysql> select * from data03.t01;  +-----+------+------+  | id1 | a1   | b1   |  +-----+------+------+  |   1 |    1 |    1 |  |   2 |   12 |    2 |  |   5 |    5 |    5 |  |   6 |    6 |    6 |  |   8 |    8 |    8 |  +-----+------+------+  5 rows in set (0.00 sec)




##########################################

.FLUSH TABLES WITH READ LOCK

这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。

解锁的语句也是unlock tables。


2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}

这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。

解锁语句也是unlock tables。


重点:

这两个语句在执行的时候都需要注意个特点,就是 隐式提交的语句。在退出MySQL终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话。

P.S. MYSQL的read lock和wirte lock


read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁

write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁




数据 数据库 命令 状态 用户 同步 权限 模式 保证 主从 变化 全局 日志 应用 语句 参数 时候 错误 实验 提示 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 互联网络科技有限公司 喔噻互联网科技 美国互联网科技 紫鲸互联网科技 广州紫鲸互联网科技 亿人帮互联网科技 科技互联网创业计划书 四个字互联网科技公司取名 青岛科技大学互联网大赛研究生 知域互联网科技有限公司大骗子 移动互联网年度科技创新 互联网媒体平台算高科技产业 想开互联网科技公司怎么样 乌鲁木齐新华智原互联网科技学校 科技大学互联网 烟台灵鸽互联网科技有限公司 中国互联网有什么科技 从那以后互联网科技有限公司 陕西云淼互联网科技公司 科技互联网产品 深圳期待互联网科技 常德市电业局互联网科技部 重庆威客帮互联网科技 燊美集互联网科技有限公司 畅思互联网科技 工业互联网等科技实现智能化赋能 信承诺互联网科技有限公司 互联网科技手抄报图片 平安好医生打造互联网科技医疗
0