如果我想更改 NOT NULL 列以允许空值,那么ALTER TABLE
在我的 DB 从属服务器上运行该操作、等待它赶上进度,然后将其提升为主服务器是否安全?
答案1
当您从“NOT NULL”变为“NULL”时,这应该没问题。以下是我要做的:
- 停止从服务器上的从属SQL线程[1]:
mysql> STOP SLAVE SQL_THREAD;
- 执行 ALTER TABLE
- 启动从属线程:
mysql> START SLAVE SQL_THREAD;
然后在主服务器上运行:
- 禁用该会话的 bin 日志[2]:
mysql> SET SQL_LOG_BIN=FALSE;
- 在主服务器上执行 ALTER TABLE
- 重新启用会话的 bin 日志:
mysql> SET SQL_LOG_BIN=TRUE;
[1] MySQL 复制在从服务器上以两个线程运行。I/O 线程将复制数据从主服务器复制到从服务器。SQL 线程在从服务器上执行该 SQL,执行 INSERT/UPDATE/DELETE/等。您可以独立停止每个线程。
[2] 这只会影响你所在的会话,而不会影响生产应用程序的其他连接。你指示 MySQL 不要将你运行的任何命令添加到 bin 日志中以进行复制。你需要这样做,这样你的命令ALTER TABLE
就不会复制到从属服务器上,因为它已经在那里运行了。
答案2
我刚刚读完一篇关于使用 MMM 修改大表假设您正在使用或可以设置MMM,这似乎可以解决您的问题。