![更改从属服务器上的 mysql 表列,然后将其提升为主服务器](https://linux22.com/image/536609/%E6%9B%B4%E6%94%B9%E4%BB%8E%E5%B1%9E%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%20mysql%20%E8%A1%A8%E5%88%97%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E5%85%B6%E6%8F%90%E5%8D%87%E4%B8%BA%E4%B8%BB%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
如果我想更改 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,这似乎可以解决您的问题。