mysql 是否像 apache httpd 一样优雅或安全地重启?

gio*_*o79 33 mysql

我想优雅地重新启动 mysql,就像在重新启动之前提供线程的 httpd 一样。我不希望查询中断。

Mic*_*bot 43

MySQL 中的任何“请求的”关闭序列(缺少kill -9)都有些优雅,因为正在进行的事务(在事务表上)会回滚,但这里有几种方法可以使重新启动尽可能干净。

注意:如果你是为了升级而关闭服务器,那么不要使用这个过程;相反,请按照此答案详述的流程进行操作

否则,如果您只是重新启动一个其他健康的服务器,以便您可以更改只读全局变量或类似的东西,这里是一个优雅的路径:

首先,innodb_fast_shutdown如果尚未启用,请启用。这与关闭的优雅没有直接关系,但它应该使您的服务器更快地恢复。

mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

接下来,指示服务器在没有当前运行的查询引用它们时立即关闭所有打开的表。这一步也和优雅关机没有关系,但是会让后面的步骤走得更快:

mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)
Run Code Online (Sandbox Code Playgroud)

FLUSH TABLES语句(带有可选LOCAL关键字,可避免对任何从属节点进行不必要但无害的刷新)将阻塞,并且您的提示不会返回,直到所有表都可以关闭。一旦每个表都被“刷新”(关闭),如果查询随后引用了该表,它将自动重新打开,但没关系。我们通过这一步完成的是减少最后一步的工作:

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

该语句刷新所有表(因此可以通过前一步较少破坏性地清除其中的一些表)并获取对它们的全局(服务器范围)只读锁。

在每个当前运行的“写”查询(即,几乎所有但SELECT)都完成之前,您不能拥有全局读锁。发出锁定请求将允许完成现有查询,但不允许启动新查询。

持有这个全局锁之前,您的提示不会返回,因此当您请求锁时正在进行的每个查询都能够完成,并且您知道它们已完成,因为您会收到提示。任何尝试向任何表写入任何内容的后续查询都将停止,不更改任何数据,无限期地等待锁定,直到...

  • 您改变了重新启动的想法并手动释放锁定 ( UNLOCK TABLES;)
  • 您重新启动服务器,或
  • 您不小心或故意断开命令行客户端与该线程的连接(所以不要这样做)。保持此窗口连接并坐在 mysql 提示符处:

抵制关闭它的诱惑。

mysql>
Run Code Online (Sandbox Code Playgroud)

这个空闲的控制台提示是为你持有全局锁的东西。失去这个,失去锁。

从另一个控制台窗口,以您通常使用的方式重新启动 MySQL,可以使用 initscripts(例如,您的本地变体service mysql.server restart)或mysqladmin shutdown手动重新启动。