因此,我对调优InnoDB相当陌生。我正在将表(如有必要)从MyIsam缓慢更改为InnoDB。我在innodb中有大约100MB,因此我将innodb_buffer_pool_size变量增加到128MB:

当我更改innodb_log_file_size值时(例如,mysql上的my.cnf innodb配置页注释将日志文件大小更改为缓冲区大小的25%。因此,现在,我的my.cnf如下所示:

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


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


110216 9:48:41 InnoDB:初始化缓冲池,大小= 128.0M
110216 9:48:41 InnoDB:缓冲区的完整初始化pool
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变量?

#1 楼

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

尝试一下!!!

UPDATE 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


UPDATE 2013-04-19 16:16 EDT

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

请注意,将innodb_fast_shutdown设置为2会清除日志。同样,但是仍然有更多的活动部件存在,并且在mysqld启动期间被Crash Recovery选中。最好设置为0。

评论


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

–贾斯汀·诺埃尔(Justin Noel)
2012年11月21日19:00

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

– f055
2012年12月6日13:55

#2 楼

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


要在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日志文件的数量或大小,请执行以下步骤:


停止MySQL服务器,并确保它关闭且没有错误。
编辑my.cnf以更改日志文件配置。要更改log
文件大小,请配置innodb_log_file_size。要增加
日志文件的数量,请配置innodb_log_files_in_group。
再次启动MySQL服务器。

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


评论


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

–德里克·唐尼(Derek Downey)
16-10-25在14:29

#3 楼

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

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


set innodb_fast_shutdown = OFF
重新启动mysql
停止mysql
删除日志文件
启动mysql
< br日志文件跟踪未完成的业务; “ innodb_fast_shutdown”表示重新启动后要处理这些东西。所以删除文件可能会丢失信息? 5.6无需先删除iblog即可更改innodb_log_file_size *
5.7允许动态调整大小innodb_log_file_size


我应该更改log_file_size吗?

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

如果小于60(分钟),则可能有助于增加log_file_size。如果更多,那么日志文件将浪费磁盘空间。 “ 1小时”相当随心所欲,因此,如果您接近它,则不必费心更改log_file_size。

GLOBAL STATUS保留为默认值2。

评论


感谢您的支持。新读者可能不需要这个。在5.6.8中,对innodb_log_file_size进行了增强,可以在不删除iblog文件的情况下对其进行更改。

–里克·詹姆斯(Rick James)
15年8月30日在0:44

糟糕,另一个附录的时间-innodb_buffer_pool_size可以动态更改-从5.7.5(9/2014)起更多详细信息。

–里克·詹姆斯(Rick James)
16-3-21在20:17



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

–slhck
19 Mar 15 '19在9:25



#4 楼

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

评论


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

–RDFozz
17年12月29日在17:54

@RDFozz你是对的。这不能回答如何更改日志文件的大小。这个问题回答了如何弄清楚设置innodb_log_file_size的数字。五年前,我已经回答了这个问题(请参阅dba.stackexchange.com/questions/23189/…中的小标题“日志文件大小”)

– RolandoMySQLDBA
17年12月29日在18:02



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

– Linux新手
17年12月29日在20:23

我很欣赏这篇文章,它看起来像是一种使用真实数据而不是猜测的方法,这很好。也许您可以添加有关此计算如何产生的参考?

–埃勒特·范·科珀伦
1月10日10:43

#5 楼

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

试试看,保证能正常工作[在Debian 6上测试]

评论


这不能保证干净关闭。一般情况下,它在只有轻负载的服务器上就可以工作,但是如果您关心数据库的完整性,则不建议这样做。

–埃米尔·维克斯特伦(EmilVikström)
2015年2月23日在11:00