mysql - 是否可以绕过 MySQL Azure 的限制?

标签 mysql azure

我使用的是 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/

相关文章:

mysql - 限制表中无 PK 删除的行数

mysql - SQL 聚合函数 MAX/MIN/AVG/COUNT 的子查询等价物是什么

azure - 从缺少列 Power BI 的文件夹加载多个文件

python-3.x - Azure 函数 HTTP 触发器 : How to return exception from python worker log to the API caller

sql-server - SQL Server 到服务总线

Azure AD 授权端点请求管理员同意

mysql - 在 MySQL 中声明变量语法无效?

php - 按最新评论排序 Wordpress 帖子

php - Kohana 准备好的语句或查询构建?

c# - 无法从另一个azure函数运行HttpTrigger Azure函数