首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态更改为innodb_flush_log_at_trx_commit

动态更改为innodb_flush_log_at_trx_commit
EN

Database Administration用户
提问于 2012-12-07 05:03:51
回答 2查看 35.5K关注 0票数 11

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

MySQL手册认为,innodb_flush_log_at_trx_commit是一个全局动态变量。因此,我可以使用SET全局命令来更改它,而且它似乎正在工作。

代码语言:javascript
运行
复制
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。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2012-12-07 14:38:23

虽然我同意Rolando关于改变innodb_flush_method的建议,但我并不十分清楚您的意思:

它没有使实际的MySQL设置发生更改。

我想指出警告,对全局变量的更改会影响任何新的连接,但不会修改当前会话(强调我的):

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

因此,为了核实这一点:

代码语言:javascript
运行
复制
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)
票数 12
EN

Database Administration用户

发布于 2012-12-07 10:02:56

通过设置诺姆b_同花顺_日志_在…_trx_提交,您可能会混淆mysqld/OS的互操作性。我这么说是因为操作系统被信任来执行刷新。

注意来自MySQL文档的注意事项

许多操作系统和一些磁盘硬件欺骗了从磁盘到磁盘的操作.他们可能会告诉我,冲水已经发生了,尽管它没有。那么,即使设置了1,事务的持久性也不能得到保证,在最坏的情况下,停电甚至会破坏InnoDB数据库。在SCSI磁盘控制器或磁盘本身中使用电池支持的磁盘缓存可以加快文件刷新速度,使操作更加安全。您还可以尝试使用Unix命令hdparm禁用硬件缓存中的磁盘写入,或者使用特定于硬件供应商的其他命令。

这说明如下:操作系统可以像欺骗丈夫一样撒谎。操作系统说,它将冲到磁盘上,而不是这样做。因此,即使设置了innodb_flush_log_at_trx_commit,也必须将OS刷新从mysqld的刷新分离到磁盘。

如果您还没有这样做,请尝试将诺姆b设置为O_DIRECT。您可能会看到不同之处,因为刷新方法差别很大(请参阅我的Mar 04, 2011 post MySQL innodb的澄清_同花顺_方法变量对 )。

警告

正如您提到的,您没有访问my.cnf的权限。请与您的提供商的SysAdmin联系,并更改诺姆b_同花顺_方法

更新2012-12-10 12:45

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

代码语言:javascript
运行
复制
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的澄清_同花顺_方法变量对帖子

票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/29963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档