我需要在我的 Web 服务器上升级 MySQL。随时可能有许多用户连接到服务器,对数据库执行查询或更新,或将文件上传到服务器。除了提前通知系统将在一定时间内进行维护,我还应该怎么做才能避免在某些用户操作仍在进行时停止MySQL服务或服务器的情况,这可能导致损坏文件系统还是数据库?
如果你优雅地停止 MySQL 服务器进程,文件系统和数据库不会被破坏。
以下是我通常会做的几件事:
确认innodb_fast_shutdown
已禁用。如果不是,请禁用它。
mysql> show variables like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0 |
+----------------------+-------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
根据文档,这仅在进行主要版本升级时才需要,但我认为这仍然是一个好主意 - 此步骤会增加您的关闭时间,但会使您的实例处于更稳定的状态以重新启动。
接下来,您可以锁定所有表以防止客户端执行任何操作。这一步在技术上也不是必需的,但我喜欢它,因为它让我知道发生了什么 - 什么不是 - 以及何时 - 并且它缩短了关闭的下一部分,因为不会有任何客户端活动要等待。
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
请注意,在繁忙的服务器上,该语句不会很快返回。在服务器成功关闭所有打开的表并获得整个数据库中每个表的锁之前,它不会返回——因此,如果您在发出此语句时有正在执行的查询,它们将被允许完成,然后锁获得,然后是您收到提示的时间。
mysql>
Run Code Online (Sandbox Code Playgroud)
重要提示:保持此连接打开。让它坐在那里并移动到一个新窗口,因为打开的连接是持有全局读锁的东西。如果您关闭或以其他方式丢失此连接,则会释放读锁。
如果您想查看任何变量、进程列表等,您仍然可以根据需要使用此连接。只是不要断开与服务器的连接。
此时(因为您得到了提示),您的表被锁定,无法进行进一步的更改,并且您的应用程序层可能会开始表现不佳,因为积压可能会增加。这是意料之中的,因为对服务器的任何查询都将无限期地等待该读锁。客户端连接的数量可能会增加,但它们将无能为力。
在另一个窗口中,查看 MySQL 错误日志。
shell> tail -f /usr/local/mysql/data/hostname.err
Run Code Online (Sandbox Code Playgroud)
在另一个窗口中,关闭 MySQL 服务器:
shell> mysqladmin shutdown
Run Code Online (Sandbox Code Playgroud)
您很可能需要为此命令添加 --username --password 和可能的其他选项。您不会从此窗口看到太多内容,因此请返回并查看您的错误日志:
服务器说,“我们要正常关机。” (不是用太多的话,但这就是下一个日志条目的意思......)
130119 13:29:17 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Normal shutdown
Run Code Online (Sandbox Code Playgroud)
服务器关闭所有系统线程。在这种情况下,我让事件调度程序甚至复制保持运行,以说明正常关闭确实很正常。(是的,我的服务器在我捕获此输出后立即启动备份,包括复制。)实际上,STOP SLAVE;
在刷新表并获取读取锁之前手动停止复制可能更好。事件调度程序是一个可选功能,您可能会或可能不会使用。这是示例输出:
130119 13:29:17 [Note] Event Scheduler: Killing the scheduler thread, thread id 1
130119 13:29:17 [Note] Event Scheduler: Waiting for the scheduler thread to reply
130119 13:29:17 [Note] Slave I/O thread killed while reading event
130119 13:29:17 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.001539', position 849647640
130119 13:29:17 [Note] Event Scheduler: Stopped
130119 13:29:17 [Note] Event Scheduler: Purging the queue. 3 events
130119 13:29:17 [Note] Slave SQL thread exiting, replication stopped in log 'mysql-bin.001539' at position 849626716
Run Code Online (Sandbox Code Playgroud)
InnoDB 进行清理(包括“缓慢关闭”)...
130119 13:29:19 InnoDB: Starting shutdown...
130119 13:29:20 InnoDB: Waiting for 6 pages to be flushed
130119 13:29:26 InnoDB: Shutdown completed; log sequence number 2718873505306
Run Code Online (Sandbox Code Playgroud)
服务器关闭了...
130119 13:29:26 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Shutdown complete
Run Code Online (Sandbox Code Playgroud)
mysqld_safe 包装器注意到服务器已停止运行。如果服务器崩溃,此进程负责尝试重新启动服务器,但如果服务器已删除其自己的 pid 文件,则不会尝试重新启动,因为假设关闭是正常的。
130119 13:29:27 mysqld_safe mysqld from pid file /usr/local/mysql-5.5.28-solaris10-x86_64/data/psi2.pid ended
Run Code Online (Sandbox Code Playgroud)
您现在可以正常关闭了。
归档时间: |
|
查看次数: |
3611 次 |
最近记录: |