所以我对调整 InnoDB 还很陌生。我正在慢慢地将表(必要时)从 MyIsam 更改为 InnoDB。我在 innodb 中有大约 100MB,所以我将innodb_buffer_pool_size变量增加到 128MB:
innodb_buffer_pool_size
mysql> show variables like 'innodb_buffer%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | innodb_buffer_pool_size | 134217728 | +-------------------------+-----------+ 1 row in set (0.00 sec)
当我去更改值时( mysql 的 innodb 配置页面innodb_log_file_size上的示例 my.cnf注释将日志文件大小更改为缓冲区大小的 25%。所以现在我的 my.cnf 看起来像这样:
innodb_log_file_size
# innodb innodb_buffer_pool_size = 128M innodb_log_file_size = 32M
当我重新启动服务器时,出现此错误:
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变量?
是的,一旦 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
启动 mysqld 将重新创建ib_logfile0和ib_logfile1
ib_logfile0
ib_logfile1
试试看 !!!
在重做日志文件之前,它会干净地分页出 InnoDB 缓冲池中的所有数据,您应该在关机前大约 1 小时设置此选项:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
默认情况下,innodb_max_dirty_pages_pct为 75(MySQL 5.5+)或 90(MySQL 5.5 之前)。将此设置为零可使脏页数保持在 InnoDB 缓冲池的 1% 以下。service mysql stop无论如何,表演都会这样做。此外,关机将完成重做日志中的所有剩余项目。要保留此选项,只需将其添加到 /etc/my.cnf:
service mysql stop
[mysqld] innodb_max_dirty_pages_pct = 0
我用innodb_fast_shutdown更新了我的答案,因为我曾经重新启动 mysql 并停止 mysql 来执行此操作。现在,这一步骤至关重要,因为每个未提交的事务都可能在 InnoDB 事务日志内外有其他移动部分(请参阅 InnoDB 基础结构)。
请注意,将innodb_fast_shutdown设置为 2 也会清除日志,但更多移动部件仍然存在,并在 mysqld 启动期间在崩溃恢复时被选中。最好设置为 0。