MySQL 5.5 - Innodb - innodb_log_file_size 大于 4GB 的总和?

Tom*_*eee 5 mysql innodb tuning mysql-5.5

在线阅读有关 innodb_log_file_size 时,它说

日志文件的总大小必须小于 4GB

那么如果它需要更大呢?

在书籍和网上,它说将 innodb_log_file_size 设置为至少一个小时的写入值。

目前我有 2 个 1GB 的日志文件,在计算Innodb_os_log_written1 小时时,至少需要 10GB。2GB 的日志文件只能在我们的峰值负载下进行 20 分钟的写入。

蒂亚!

Rol*_*DBA 8

多年前,我将innodb_log_file_size设置为 2047M。这是在不超过 InnoDB 的 4GB 限制的情况下允许创建事务日志文件的最大数量。我相信它仍然适用于当前版本(MySQL 5.5)。请记住,InnoDB 旨在在 32 位环境中工作,因此有 4GB 的限制。

好消息

Percona Server 二进制文件实际上超越了这个限制。我相信我在一次安装中看到了 4GB 作为innodb_log_file_size。没错,我说的是 4GBib_logfile0和 4GB ib_logfile1,** 总共 8GB **。这是我雇主的一位客户的数据库服务器的当前列表:

[root@*** ~]$ ls -l /var/lib/mysql/ib*
-rw-rw---- 1 mysql mysql 2283798528 Jan 16 22:53 /var/lib/mysql/ibdata1
-rw-rw---- 1 mysql mysql 4294967296 Jan 16 22:52 /var/lib/mysql/ib_logfile0
-rw-rw---- 1 mysql mysql 4294967296 Jan 16 22:53 /var/lib/mysql/ib_logfile1
Run Code Online (Sandbox Code Playgroud)

当我登录到 mysql 时,我看到此欢迎消息:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 177401833
Server version: 5.1.45-51-log Percona SQL Server (GPL), XtraDB 10

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Run Code Online (Sandbox Code Playgroud)

所以,Percona Server 5.1.45 可以让你制作巨大的 InnoDB 事务日志。所以,我非常确定 Percona Server 5.5(使用 XtraDB)会让你创建大于 2GB 的 InnoDB 日志文件。

推荐

如果您确实需要那么大(> 2G)的日志文件,请升级到带有 XtraDB 存储引擎的 Percona Server。它是 InnoDB 的绝佳替代品。

警告

日志文件越大,关闭过程可能变得越长。我会推荐以下内容:

[mysqld]
innodb_fast_shutdown=0
Run Code Online (Sandbox Code Playgroud)

这样,任何留在 ibdata1 中的未提交事务都会在关闭时提交,而不是在启动期间 MySQL 的崩溃恢复时提交。

更新 2013-01-17 11:40 EDT

从你的最后两条评论来看,你对我的问题是

innodb_log_file_size 对于负载来说太低有什么缺点 - 不到 1 小时?

我会说必须将频繁的检查点写入磁盘。这可能会使 InnoDB为事务隔离处理MVCC变得非常烦人。

您可以为您达到峰值的任何事务率正确调整 InnoDB 日志文件的大小。我之前写过这篇文章:在具有 48GB RAM 的服务器上正确调整 30GB InnoDB 表(在 部分下Log File Size)。这是我之前帖子的摘录:

日志文件大小

5MBinnodb_log_file_size的默认大小。Percona 的mysqlperformanceblog.com提供了两篇关于为您的特定 MySQL 实例计算合适大小的好文章:

基本上,该博客建议测量一小时内写入 InnoDB 日志文件的字节数。这就是我想弄清楚的

SET @TimeInterval = 3600;
SELECT variable_value INTO @num1 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SELECT SLEEP(@TimeInterval);
SELECT variable_value INTO @num2 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SET @ByteWrittenToLog = @num2 - @num1;
SET @KB_WL_HR = @ByteWrittenToLog / POWER(1024,1) * 3600 / @TimeInterval;
SET @MB_WL_HR = @ByteWrittenToLog / POWER(1024,2) * 3600 / @TimeInterval;
SET @GB_WL_HR = @ByteWrittenToLog / POWER(1024,3) * 3600 / @TimeInterval;
SELECT @KB_WL_HR,@MB_WL_HR,@GB_WL_HR;
Run Code Online (Sandbox Code Playgroud)

无论返回什么数字@MB_WL_HR,取一半并将 innodb_log_file_size 调整为它:请参阅我的帖子如何安全地更改 MySQL innodb 变量“innodb_log_file_size”?