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


105

因此,我对调优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值时(例如,mysql的innodb配置页 my.cnf 注释将日志文件大小更改为缓冲区大小的25%。因此,现在,my.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 [ERROR]插件'InnoDB'初始化函数返回错误。
110216 9:48:41 [错误]插件'InnoDB'注册为存储引擎失败。

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


1
只需在my.ini中评论innodb_log_file_size .....

5
嗯,当我尝试将默认值更改为默认值时,为什么要注释掉它以使用默认值?
德里克·唐尼

是的,通过在innodb_log_file_size行中对其进行评论。
穆罕默德·乌玛·法鲁格直率2015年

2
@muhammadumarfarooqfrank当然可以了-因为您不再更改变量的值,因此使整个讨论变得毫无意义。我希望有一种方法可以拒绝评论。
dr01

Answers:


83

是的,一旦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_logfile0ib_logfile1

试试看 !!!

更新美国东部时间2011-10-20 16:40

在重做日志文件之前,它会干净地分页出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。


1
答案很好,更新也很好。我唯一的建议是将ib_logfiles复制到另一个位置,以防出现问题。这将帮助您了解如何调整文件大小:mysqlperformanceblog.com/2011/07/09/…–
Justin Noel

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

2
警告!!第3步对我不起作用,当我看到没有InnoDB的情况下加载mysql时,我的心几乎停止了,不得不停止mysql并手动将其删除,然后再次启动MySQL。两个建议:1.备份您已经存在的日志文件,2.手动删除文件
Peeyush Kushwaha 2013年

2
Peeyush是正确的。甚至mysql文档也建议备份您的日志文件,以防万一出问题
Greg

1
@Greg这就是我使用的原因SET GLOBAL innodb_fast_shutdown = 0;。当MySQL关闭时,所有事务部分都从所有活动部分刷新,包括重做日志(ib_logfile0和ib_logfile1)。一个可以保留它们。我还没有遇到完全刷新日志的问题。
RolandoMySQLDBA 2015年

31

相反,我建议使用官方方法,为方便起见,在此复制:

要在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与重做日志文件的大小不同,它将编写一个日志检查点,关闭并删除旧的日志文件,以请求的大小创建新的日志文件,然后打开新的日志文件。


这是对这个问题的更新,是一个很好的答案。+1 !!!
RolandoMySQLDBA 2013年

2
这不是“更新”。这些手册页早已存在。我总是推荐使用手册中的第一手信息(最好的手册之一),而不是重新发明轮子和复制信息(这是DBA最讨厌的东西)。
RandomSeed 2013年

从MySQL 5.6开始,这是首选方法。如果您碰巧仍在5.6之前的版本上运行,则将无法使用。
Derek Downey

20

innodb_buffer_pool_size-只需更改my.cnfmy.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
  • innodb_log_file_size无需先删除iblog *即可更改5.6
  • 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。


+1您的担忧似乎得到了文档的
杰克·道格拉斯

我看了看这个答案,我喜欢第一行。通常,我会让客户来回移动mysql,以防--skip-networking万一,以免最后的更改。您的第一行(设置innodb_fast_shutdown = OFF)消除了这一点。+1 !!!
RolandoMySQLDBA 2012年

1
感谢您的支持。新读者可能不需要这个。在5.6.8中innodb_log_file_size已进行了增强,可以在不删除iblog文件的情况下进行更改。
里克·詹姆斯

您是说“更重要”而不是“不太重要”吗?
伊戈尔(Igor)

@Igor-否。如果您的log_file_size太小,则会有更多的I / O穿过它。我很少看到。如果太大,就浪费磁盘空间。设置它的目标是在一小时内循环。但是,相对于10分钟还是10分钟,这并不重要。更多...
Rick James

1

当您登录到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


1
(至少对我而言),这实际上并不能回答问题。这似乎是对日志文件备用大小的建议,而不是如何安全地更改日志文件的大小。
RDFozz

1
@RDFozz你是对的。这不能回答如何更改日志文件的大小。这个问题回答了如何弄清楚设置innodb_log_file_size的数字。我已经回答了这样一个问题,五年前(见副标题Log File Sizedba.stackexchange.com/questions/23189/...
RolandoMySQLDBA

我只想提供帮助://尽管我不知道确切的答案。
Linux新手

-4

chown mysql:mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * &&服务mysql restart || 服务mysql重启

尝试一下,保证可以正常使用[在Debian 6上测试]


2
这不能保证干净关闭。在通常只有轻负载的服务器上,它通常可以工作,但是如果您关心数据库的完整性,则不建议这样做。
EmilVikström'15
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.