如何安全地更改 MySQL innodb 变量“innodb_log_file_size”?

Der*_*ney 113 mysql innodb myisam logs

所以我对调整 InnoDB 还很陌生。我正在慢慢地将表(在必要时)从 MyIsam 更改为 InnoDB。我在 innodb 中有大约 100MB,所以我将innodb_buffer_pool_size变量增加到 128MB:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

当我去更改innodb_log_file_size值时(例如mysql 的 innodb 配置页面my.cnf注释将日志文件大小更改为缓冲区大小的 25%。所以现在我的 my.cnf 看起来像这样:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
Run Code Online (Sandbox Code Playgroud)

当我重新启动服务器时,出现此错误:

110216 9:48:41 InnoDB:初始化缓冲池,大小 = 128.0M
110216 9:48:41 InnoDB:缓冲池初始化完成
InnoDB:错误:日志文件 ./ib_logfile0 的大小不同 0 5242880 字节
InnoDB:比指定的.cnf 文件 0 33554432 字节!
110216 9:48:41 [错误] 插件“InnoDB”初始化函数返回错误。
110216 9:48:41 [错误] 插件“InnoDB”注册为存储引擎失败。

所以我的问题是:删除旧的 log_files 是否安全,或者是否有另一种方法来更改innodb_log_file_size变量?

Rol*_*DBA 89

是的,一旦 mysqld 关闭,删除日志文件是安全的

鉴于此,只需执行以下步骤:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start
Run Code Online (Sandbox Code Playgroud)

启动 mysqld 将重新创建ib_logfile0ib_logfile1

试一试 !!!

更新 2011-10-20 16:40 EDT

它在重做日志文件之前干净地分页出 InnoDB 缓冲池中的所有数据,您应该在关闭前大约 1 小时设置此选项:

SET GLOBAL innodb_max_dirty_pages_pct = 0;
Run Code Online (Sandbox Code Playgroud)

默认情况下,innodb_max_dirty_pages_pct为 75(MySQL 5.5+)或 90(MySQL 5.5 之前)。将此设置为零可使脏页数保持在 InnoDB 缓冲池的 1% 以下。表演service mysql stop无论如何都是这样做的。此外,关闭将完成重做日志中的所有剩余项目。要保留此选项,只需将其添加到 /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0
Run Code Online (Sandbox Code Playgroud)

更新 2013-04-19 16:16 EDT

我用innodb_fast_shutdown更新了我的答案,因为我曾经重新启动 mysql 并停止 mysql 来执行此操作。现在,这一步至关重要,因为每个未提交的事务可能在 InnoDB 事务日志内部和外部都有其他移动部分(请参阅 InnoDB 基础架构)。

请注意,将innodb_fast_shutdown设置为 2 也会清除日志,但更多活动部件仍然存在,并在 mysqld 启动期间在崩溃恢复中被选中。最好设置为 0。

  • 也对我有用,但是:linux 控制台 UI 可能会产生误导 - 如果您设置了大日志文件大小(数百 MB 或更多),mysqld 启动将花费大量时间。控制台 UI 向您显示点,然后显示“失败!”,但实际上 MySQL 仍在启动。等待并继续读取日志文件(或使用“tail -f [log-file]”监视日志文件),直到看到“mysqld:准备好连接”。和磁盘上分配的两个日志文件。 (5认同)

小智 32

我会推荐官方方法,为了方便起见,我在这里复制:

要在MySQL 5.6.7 或更早版本中更改 InnoDB 日志文件的数量或大小,请使用以下说明。要使用的过程取决于 innodb_fast_shutdown 的值,它决定是否在关闭操作之前使系统表空间完全更新:

  • 如果 innodb_fast_shutdown 未设置为 2:停止 MySQL 服务器并确保它关闭没有错误,以确保重做日志中没有未完成事务的信息。将旧的重做日志文件复制到安全的地方,以防在关闭期间出现问题并且您需要它们来恢复表空间。从日志文件目录中删除旧的日志文件,编辑my.cnf更改日志文件配置,再次启动MySQL服务器。mysqld 发现启动时不存在 InnoDB 日志文件并创建新的日志文件。

  • 如果 innodb_fast_shutdown 设置为 2:将 innodb_fast_shutdown 设置为 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

然后按照上一项中的说明进行操作。

从 MySQL 5.6.8 开始,在更改 InnoDB 日志文件的数量或大小时, innodb_fast_shutdown 设置不再相关。此外,您不再需要删除旧日志文件,尽管您可能仍希望将旧日志文件复制到安全位置作为备份。要更改 InnoDB 日志文件的数量或大小,请执行以下步骤:

  1. 停止 MySQL 服务器并确保它关闭没有错误。

  2. 编辑 my.cnf 以更改日志文件配置。要更改日志文件大小,请配置 innodb_log_file_size。要增加日志文件的数量,请配置 innodb_log_files_in_group。

  3. 再次启动 MySQL 服务器。

如果 InnoDB 检测到 innodb_log_file_size 与重做日志文件大小不同,它将写入日志检查点,关闭并删除旧日志文件,以请求的大小创建新日志文件,并打开新日志文件。


Ric*_*mes 23

innodb_buffer_pool_size-- 只需更改my.cnf( my.ini) 并重新启动 mysqld。

innodb_log_file_size不太重要。除非有理由,否则不要更改它。Roland提供了步骤,但有一个方面让我担心……我不知道前两个步骤是否重要;看起来他们可能是:

  1. set innodb_fast_shutdown = OFF
  2. 重启mysql
  3. 停止mysql
  4. 删除日志文件
  5. 启动mysql

日志文件跟踪未完成的事务;” innodb_fast_shutdown“说是重启处理那个东西。那么删除文件可能会丢失信息?

新版本改进了一些东西:( 评论中有更多讨论)

  • 5.6 允许innodb_log_file_size> 4GB
  • 5.6innodb_log_file_size无需先删除iblog即可更改*
  • 5.7 允许动态调整大小 innodb_buffer_pool_size

我应该更改 log_file_size 吗?

使用GLOBAL STATUS计算日志周期之前的分钟数。

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`
Run Code Online (Sandbox Code Playgroud)

如果它远小于60(分钟),那么增加 log_file_size 可能会有所帮助。如果它更多,那么日志文件正在浪费磁盘空间。“1 小时”是相当随意的,因此如果您接近它,请不要费心更改 log_file_size。

保留innodb_log_files_in_group默认值 2。

  • 请考虑更新您的答案以反映 MySQL 的当前状态。人们可能不会在评论部分阅读您的附录。 (2认同)