动态更改为innodb_flush_log_at_trx_commit


11

这与这个问题有关。它确实有助于为InnoDB表获得更好的性能。

根据MySQL手册innodb_flush_log_at_trx_commit是全局动态变量。因此,我可以使用SET GLOBAL命令更改它,但它似乎正在工作。

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

但是,它并没有改变实际的MySQL设置。当我更新my.cnf并重新启动MySQL服务器时,它确实起作用了。因此,我不能在运行时更改全局变量吗?

我更喜欢默认值innodb_flush_log_at_trx_commit=1,但是我需要将其更改为2,然后才能运行恢复过程以使大型数据库更快地运行。但是,当过程完成后,我想将值更改回1。是否可以在运行时执行此操作?

我没有访问共享托管服务器上的my.cnf的权限。

Answers:


12

虽然我同意Rolando提出的更改建议innodb_flush_method,但我并不是100%清楚您的意思是:

它并没有改变实际的MySQL设置

我要指出的警告是,对GLOBAL变量进行更改会影响任何新连接,但不会修改当前会话(强调我的):

全局变量更改不会影响当前连接的任何客户端的会话变量(甚至不会发出SET GLOBAL语句的客户端的会话变量)。

所以要检查一下:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
这个答案很有道理。文档(dev.mysql.com/doc/refman/5.5/en/…)没有说会话级别的变量可以更改,而只是全局级别的。我经历了很多次更改max_connections的情况,SET GLOBAL max_connections = 1000;而当我SHOW VARIABLES LIKE 'max_connections';看到旧值将使我无所适从,直到我注销并重新登录。对于这种观点,+ 1是被授予并经常被人们遗忘的。
RolandoMySQLDBA 2012年

@Rolando我也是!当我发现我可以“连接”时,我也很高兴;无需注销并重新登录。节省时间!
Derek Downey

connect在MySQL中,运行的概念实际上对我来说是新的。我在PostgreSQL和Oracle中做了一百万次。我从没想过MySQL允许这样做
RolandoMySQLDBA 2012年

@DTest,谢谢您的回答。根据我的深入测试,它确实是动态工作的。在我的本地主机中,更改了会话变量而未运行connect(issue时出现错误connect)。使用值2时,导入2,241,319条记录花费了27分钟43秒,而使用值1则花费了大约1天。该设置在当前会话中似乎正常工作,但是my.cnf在重新启动后恢复了原始设置(从)。
锡胡

@DerekDowney,这仅适用于某些设置innodb_flush_log_at_trx_commit吗?还是对所有设置而言,设置global都不会影响当前会话?
Pacerier,2015年

7

通过设置innodb_flush_log_at_trx_commit,您可能会与mysqld / OS互操作性混淆。我之所以这样说,是因为信任操作系统来执行刷新。

请注意MySQL文档中的警告

许多操作系统和某些磁盘硬件使“刷新磁盘”操作变得愚蠢。他们可能告诉mysqld刷新已经发生,即使没有发生。这样,即使设置为1,也无法保证事务的持久性,在最坏的情况下,断电甚至会损坏InnoDB数据库。在SCSI磁盘控制器或磁盘本身中使用电池供电的磁盘缓存可以加快文件刷新的速度,并使操作更安全。您也可以尝试使用Unix命令hdparm禁用硬件高速缓存中磁盘写入的高速缓存,或者使用其他特定于硬件供应商的命令。

这说明了以下内容:操作系统可能像欺骗的丈夫一样说谎。操作系统说它将刷新到磁盘,而根本不这样做。因此,即使您设置了innodb_flush_log_at_trx_commit,也必须将OS刷新至磁盘与mysqld刷新至磁盘分离。

尝试将innodb_flush_method设置为O_DIRECT。您可能会看到差异,因为flush方法差异很大(请参阅我在MySQL innodb_flush_method variable上Mar 04, 2011澄清)。

警告

如前所述,您无权访问my.cnf。请与您的提供商联系SysAdmin,并更改innodb_flush_method

更新2012-12-10 12:45 EDT

我当前在我的PC上运行MySQL 5.5.12。当我连接并运行时,show variables like 'innodb_flush_method';我得到

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

由于为空,因此仅表示使用默认设置。请阅读我的2011年3月4日发布的有关MySQL innodb_flush_method变量的说明。


我首先在本地主机上进行了测试。我innodb_flush_methodmy.ini(找不到my.cnf)中找不到。服务器信息-Apache 2.4.1,PHP 5.4.4,MySQL 5.5
Sithu 2012年

我注意到无论服务器版本或ini / cnf,配置文件都没有innodb_flush_method设置,SHOW VARIABLES也没有显示。
Sithu

感谢您的更新,我也知道了,我只是想知道为什么我们看不到它的价值。由于无法在my.ini或中找到它,my.cnf而且它不是动态变量,因此不确定如何配置它。
锡胡
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.