我使用的是 Azure MySQL 版本 5.6
当我尝试使用以下命令将大型 MySQL 转储文件从 Linux 环境导入到 Azure(Azure Database for MySQL 服务器)的 PaaS 中时:
pv DBFILE.sql | mysql -u username@mysqlserver -h mysqlservername.mysql.database.azure.com -pPassword DBNAME
我收到此消息:
"The size of BLOB/TEXT data inserted in one transaction is greater than 10% of redo log size. Increase the redo log size using innodb_log_file_size."
有什么办法可以绕过这个错误吗?
我在 Microsoft documentation 上读到“innodb_log_file_size”不可配置。我可以将这个大转储文件分成较小的文件并将它们全部导入吗?有什么区别吗?
最佳答案
转储文件的大小不是问题。拆分它没有帮助。
问题在于至少一行上的一个 BLOB 或 TEXT 值的大小大于 innodb 日志文件大小的 1/10。您无法将数据拆分为小于单个 BLOB 或 TEXT 值。
根据您链接到的 Azure 文档,innodb_log_file_size
的值固定为 256MB。这意味着您无法导入 BLOB 或 TEXT 值超过 25.6MB 的任何行。至少你不能将它导入到 InnoDB 表中。
原因是重做日志文件有固定的大小,而日志文件的大小对InnoDB缓冲池中修改页的数量造成了限制(但不是一对一的,因为格式重做日志文件记录与缓冲池中的页面不同)。这是一个任意的比率,但对 BLOB/TEXT 值进行限制的目的是为了避免巨大的 BLOB 在小型重做日志中环绕并覆盖其自身的一部分,这将使 MySQL 服务器处于无法正常运行的状态。从崩溃中恢复。在 MySQL 5.5 中,这只是建议的限制。在 MySQL 5.6 中,它由 InnoDB 强制执行,因此插入太大的 BLOB 或 TEXT 只会导致错误。
Amazon RDS 几年前曾经有过类似的限制。他们只支持innodb_log_file_size
的固定大小,我记得是128MB。它不可配置。
几年前,我参加了在旧金山举行的 AWS 事件,在 session 间隙,我找到了在大厅与 Amazon RDS 产品经理交谈的机会。我向他反馈说,将此设置保留在相对较小的值而无法增加它的限制太大。这意味着只能插入 12.8MB 或更少的 BLOB/TEXT。
我确信我不是唯一向他提供反馈的客户。几个月后,RDS 的更新允许更改该变量。但您必须重新启动 MySQL 实例才能应用更改,就像您自己运行 MySQL 一样。
我相信 Azure 也会发现同样的事情,并从客户那里得到大量反馈。
关于mysql - 是否可以绕过 MySQL Azure 的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62032026/