如何安全地更改mySQL innodb变量'innodb_log_file_size'?
题
因此,我对调整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)
当我去改变 innodb_log_file_size
值(例如my.cnf on MySQL的InnoDB配置页面 注释以将日志文件大小更改为缓冲区大小的25%。所以现在我的.cnf看起来像这样:
# 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'init函数返回错误。
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
试试看 !!!
更新2011-10-20 16:40 EDT
它在重做日志文件之前,它在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:
[mysqld]
innodb_max_dirty_pages_pct = 0
更新2013-04-19 16:16 EDT
我更新了答案 innodb_fast_shutdown 因为我曾经重新启动mySQL并停止mySQL来执行此操作。现在,这一单步是至关重要的,因为每个事务都可能在InnoDB交易日志内外都有其他活动部件(参见InnoDB基础架构).
请注意设置 innodb_fast_shutdown 到2也将清理登录,但在MySQLD的启动期间仍然存在更多的活动部件,并在崩溃恢复时被选中。设置为0是最好的。
其他提示
我会推荐 官方方法, ,为了方便起见,我在这里复制了:
更改InnoDB日志文件的数字或大小 MySQL 5.6.7或更早, ,使用以下说明。使用的过程取决于Innodb_fast_shutdown的值,该值决定是否在关闭操作之前将系统表空间完全最新出现:
如果未将Innodb_fast_shutdown设置为2:停止MySQL Server并确保它在没有错误的情况下关闭,以确保在重做日志中没有出色交易的信息。将旧的重做日志文件复制到一个安全的地方,以防停机期间出现问题,您需要它们恢复表空间。从日志文件目录中删除旧日志文件,编辑my.cnf以更改日志文件配置,然后再次启动mySQL Server。 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日志文件的数量或大小,请执行以下步骤:
停止MySQL Server,并确保其关闭而不会错误。
编辑my.cnf以更改日志文件配置。要更改日志文件大小,请配置Innodb_log_file_size。要增加日志文件的数量,请配置Innodb_log_files_in_group。
再次启动MySQL Server。
如果InnoDB检测到Innodb_log_file_size与重做日志文件大小有所不同,它将编写日志检查点,关闭并删除旧日志文件,在请求的大小上创建新的日志文件,然后打开新的日志文件。
innodb_buffer_pool_size
- 只需更改 my.cnf
(my.ini
)并重新启动mysqld。
innodb_log_file_size
不太关键。除非有理由,否则不要更改它。罗兰 提供了步骤, ,但是一个方面让我担心...我不知道前两个步骤是否重要;似乎他们可能是:
set innodb_fast_shutdown = OFF
- 重新启动mysql
- 停止mysql
- 删除日志文件
- 启动mysql
日志文件跟踪未完成的业务; “innodb_fast_shutdown
说要处理这些东西 后 重新启动。因此,删除文件可能会丢失信息?
新版本改进了事物: (评论中的更多讨论)
- 5.6允许
innodb_log_file_size
> 4GB - 5.6
innodb_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`
如果有很多 较少的 超过60(分钟),然后可能有助于增加log_file_size。如果更多,则日志文件将浪费磁盘空间。 “ 1小时”是相当任意的,因此,如果您接近它,请不要打扰更改log_file_size。
离开 innodb_log_files_in_group
默认为2。
当您登录MySQL时,键入这些命令:
pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G
您将获得两个数字。首先,您得到一个,然后等待一分钟。你会得到另一个。
说第一个是3.456.718.123,第二个是4.098.873.134
现在(4.098.873.134-3.856.718.123)*60/1024/1024
结果是= 13.856 MB
您有两个日志文件。因此,将其除以两个,您将获得接近7.000 MB的数字。为了确保,设置日志文件大小8GB
chown mysql:mysql -r/etc/mysql/mysql/var/lib/mysql && cd/var/lib/mysql && rm -f ib_logfile* &&服务mysql restart ||服务MySQL重新启动
尝试一下,保证可以工作[对Debian 6进行了测试