Sit*_*thu 11 mysql innodb windows configuration
这与这个问题有关。它确实有助于提高 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
Run Code Online (Sandbox Code Playgroud)
但是,它并没有改变实际的 MySQL 设置。当我更新my.cnf并重新启动 MySQL 服务器时,它确实有效。那么,我不能在运行时更改全局变量?
我更喜欢 default value innodb_flush_log_at_trx_commit=1
,但我需要在运行大型数据库的还原过程之前将其更改为 2 以加快速度。但是当过程完成后,我想将值改回 1。是否可以在运行时执行此操作?
我无法访问共享托管服务器上的my.cnf。
Der*_*ney 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)
Run Code Online (Sandbox Code Playgroud)
通过设置innodb_flush_log_at_trx_commit,您可能会与 mysqld/OS 互操作性混淆。我这么说是因为操作系统被信任来执行刷新。
请注意MySQL 文档中的警告
许多操作系统和一些磁盘硬件欺骗了刷新到磁盘操作。他们可能会告诉 mysqld 刷新已经发生,即使它没有发生。那么即使设置为 1 也不能保证事务的持久性,在最坏的情况下,断电甚至会损坏 InnoDB 数据库。在 SCSI 磁盘控制器或磁盘本身中使用电池供电的磁盘缓存可加快文件刷新,并使操作更安全。您还可以尝试使用 Unix 命令 hdparm 禁用硬件缓存中磁盘写入的缓存,或使用特定于硬件供应商的其他一些命令。
这说明如下:操作系统可以像欺骗丈夫一样撒谎。操作系统说它会刷新到磁盘,只是不这样做。因此,即使您设置了innodb_flush_log_at_trx_commit,您也必须将操作系统刷新到磁盘与mysqld 刷新到磁盘分开。
如果您还没有这样做,请尝试将innodb_flush_method设置为 O_DIRECT。您可能会看到差异,因为刷新方法差异很大(请参阅我对 MySQL innodb_flush_method 变量的澄清Mar 04, 2011
帖子)。
正如您所提到的,您无权访问my.cnf
. 请联系您的提供商的系统管理员并更改innodb_flush_method。
我目前在我的 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>
Run Code Online (Sandbox Code Playgroud)
由于它是空白的,它只是表示使用默认设置。请阅读我 2011 年 3 月 4 日发布的关于 MySQL innodb_flush_method 变量的说明
归档时间: |
|
查看次数: |
32527 次 |
最近记录: |