首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在升级MySQL之前应该做些什么?

问在升级MySQL之前应该做些什么?
EN

Database Administration用户
提问于 2013-01-16 10:09:39
回答 2查看 4.2K关注 0票数 5

我需要在我的web服务器上执行MySQL的升级。随时可能有许多用户连接到服务器,在数据库上执行查询或更新,或将文件上载到服务器。除了预先通知系统将在一段时间内进行维护外,我还应如何避免在某些用户操作仍在执行时停止MySQL服务或服务器的情况,这可能会导致文件系统或数据库的损坏?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2013-01-19 19:21:54

如果您优雅地停止了MySQL服务器进程,那么文件系统和数据库就不会损坏。

以下是我通常做的几件事:

验证是否禁用了innodb_fast_shutdown。如果不是,就禁用它。

代码语言:javascript
复制
mysql> show variables like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

根据文档,只有在进行主要版本升级时才需要这样做,但我认为这仍然是一个好主意--这个步骤增加了您的关闭时间,但是使您的实例处于更稳定的状态,以便重新启动。

接下来,您可以锁定所有表,以防止客户端执行任何操作。这一步在技术上也没有必要,但我喜欢它,因为它让我有了一种感觉,知道发生了什么--什么不是--以及什么时候--它缩短了停工的下一部分,因为不会有任何客户活动等待。

代码语言:javascript
复制
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

注意,在繁忙的服务器上,这句话不会这么快返回。它不会返回,直到服务器成功地关闭了所有打开的表并在整个数据库中的每个表上获得了一个锁--所以,如果您在发出这个语句时执行了查询,它们将被允许完成,那么所获得的锁,然后是您将得到提示的时候。

代码语言:javascript
复制
mysql>

重要事项:请将此连接打开。让它坐在那里,移动到一个新窗口,因为正在打开的连接是全局读取锁的所在。如果关闭或以其他方式丢失此连接,则将释放读锁。

如果您想查看任何变量、处理列表等,您仍然可以使用此连接。只是不要断开与服务器的连接。

此时(由于您获得了提示符),您的表将被进一步的更改锁定,您的应用程序层可能会开始表现糟糕,因为积压可能会增加。这是意料之中的,因为对服务器的任何查询都只是无限期地等待读取锁。客户端连接的数量可能在增加,但它们将无法执行任何操作。

在另一个窗口中,跟踪MySQL错误日志。

代码语言:javascript
复制
shell> tail -f /usr/local/mysql/data/hostname.err 

在另一个窗口中,关闭MySQL服务器:

代码语言:javascript
复制
shell> mysqladmin shutdown

您很可能需要添加-用户名-密码,并可能需要该命令的其他选项。从这个窗口看不到多少信息,所以请返回并查看错误日志:

服务器说,“我们要做一个优雅的关机。”(不是这么多词,但这就是下一个日志条目的意思.)

代码语言:javascript
复制
130119 13:29:17 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Normal shutdown

服务器关闭任何系统线程。在本例中,我让事件调度程序甚至复制运行,以说明优雅的关闭确实是很好的。(是的,我的服务器在捕获此输出后立即启动,包括复制。)实际上,在刷新表和获取读锁之前,最好先用STOP SLAVE;手动停止复制。事件调度程序是一个可选特性,您可以使用它,也可以不使用它。下面是输出示例:

代码语言:javascript
复制
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

InnoDB做它的清理(包括“缓慢关闭”)..。

代码语言:javascript
复制
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

服务器关机..。

代码语言:javascript
复制
130119 13:29:26 [Note] /usr/local/mysql-5.5.28-solaris10-x86_64/bin/mysqld: Shutdown complete

mysqld_safe包装器注意到服务器已停止运行。此进程负责在服务器崩溃时尝试重新启动服务器,但如果服务器删除了自己的pid文件,则不会尝试重新启动,因为关闭被假定是优雅的。

代码语言:javascript
复制
130119 13:29:27 mysqld_safe mysqld from pid file /usr/local/mysql-5.5.28-solaris10-x86_64/data/psi2.pid ended

你现在被优雅地关闭了。

票数 9
EN

Database Administration用户

发布于 2015-03-25 09:19:27

这一切都很漂亮,但有点偏执。根据您正在运行的服务器类型,您可以使用ionice来确保机器没有做任何繁重的事情,其余的都由mysql自己来处理。假设我的mysql服务器的一些脚本内存泄漏,我会发现服务器的使用率最低,然后在CPU空闲时优雅地重新启动mysqld,所以我使用crontab并这样做:

代码语言:javascript
复制
# clear and clean start MySQL and httpd daily
38 5 * * * root ionice -c3 /etc/init.d/mysqld restart > /dev/null 2>&1
39 5 * * * root /usr/sbin/apachectl graceful > /dev/null 2>&1
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/33010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档