1

将较大的文件插入配置了 InnoDB 集群复制的 MySQL 8.0 数据库时,查询会遇到表死锁。对于较小的 6 KB 文件,INSERT 有效。通过 MySQL 路由器运行以及通过直接连接到“R/W”主机运行 INSERT 时会出现问题。不太可能达到适当的交易限额。请参阅下面的 MySQL 设置。

桌子

CREATE TABLE `onlineorder_attachments` (
  `AttachmentGUID` varchar(36) NOT NULL,
  `Filename` varchar(80) DEFAULT NULL,
  `File` mediumblob,
  PRIMARY KEY (`AttachmentGUID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

测试文件 M-02-012.jpg 4.813KB => 死锁! M-05-055.jpg 6KB => 作品

命令

INSERT INTO `onlineorder_attachments`
(`AttachmentGUID`,`Filename`,`File`)
VALUES
('00a2b54f-b0cf-4f3a-9bed-02dba853b505', 'M-02-012.jpg', LOAD_FILE('/var/lib/mysql-files/tmp/M-02-012.jpg'));

MySQL 设置输出

group_replication_communication_max_message_size    10485760
group_replication_components_stop_timeout   31536000
group_replication_compression_threshold 1000000
group_replication_group_seeds   10.29.169.13:33561
group_replication_local_address 10.29.169.12:33561
group_replication_member_expel_timeout  0
group_replication_message_cache_size    1073741824
group_replication_transaction_size_limit    150000000
slave_max_allowed_packet    1073741824
slave_net_timeout   60

InnoDB 集群设置状态:

{
    "clusterName": "AppCluster",
    "defaultReplicaSet": {
        "GRProtocolVersion": "8.0.16",
        "groupName": "3afe628e-bdd1-11e9-8bbe-ac1f6bd3521c",
        "name": "default",
        "primary": "10.29.169.12:3356",
        "ssl": "REQUIRED",
        "status": "OK_NO_TOLERANCE",
        "statusText": "Cluster is NOT tolerant to any failures.",
        "topology": {
            "10.29.169.12:3356": {
                "address": "10.29.169.12:3356",
                "fenceSysVars": [],
                "memberId": "a715990f-bdc2-11e9-8ec6-ac1f6bd3521c",
                "memberRole": "PRIMARY",
                "memberState": "ONLINE",
                "mode": "R/W",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            },
            "10.29.169.13:3356": {
                "address": "10.29.169.13:3356",
                "fenceSysVars": [
                    "read_only",
                    "super_read_only"
                ],
                "memberId": "74c57dda-bdbb-11e9-94f8-ac1f6bd350ce",
                "memberRole": "SECONDARY",
                "memberState": "ONLINE",
                "mode": "R/O",
                "readReplicas": {},
                "replicationLag": null,
                "role": "HA",
                "status": "ONLINE",
                "version": "8.0.18"
            }
        },
        "topologyMode": "Single-Primary"
    },
    "groupInformationSourceMember": "10.29.169.12:3356"
}

MySQL Shell 输出错误

mysql> show open tables where in_use>0;
+----------+-------------------------+--------+-------------+
| Database | Table                   | In_use | Name_locked |
+----------+-------------------------+--------+-------------+
| appws30 | onlineorder_attachments |      1 |           0 |


mysql> show processlist;
+------+-----------------------------+---------------------------------+----------+---------+------+--------------------------------------------------------+-----------------------                                                            -------------------------------------------------------------------------------+
| Id   | User                        | Host                            | db       | Command | Time | State                                                  | Info                                                                                                                                                             |
+------+-----------------------------+---------------------------------+----------+---------+------+--------------------------------------------------------+-----------------------                                                            -------------------------------------------------------------------------------+
|    5 | event_scheduler             | localhost                       | NULL     | Daemon  |  472 | Waiting on empty queue                                 | NULL                                                                                                                                                             |
|    9 | system user                 |                                 | NULL     | Connect |  472 | waiting for handler commit                             | Group replication appl                                                            ier module                                                                     |
|   14 | system user                 |                                 | NULL     | Query   |  472 | Slave has read all relay log; waiting for more updates | NULL                                                                                                                                                             |
|  344 | remoteuser                  | 10.29.169.12:56834              | NULL     | Sleep   |  351 |                                                        | NULL                                                                                                                                                             |
|  350 | remoteuser                  | 10.29.169.12:56842              | NULL     | Sleep   |  388 |                                                        | NULL                                                                                                                                                             
|
|  497 | remoteuser                  | 10.29.169.12:56996              | NULL     | Sleep   |  351 |                                                        | NULL                                                                                                                                                             |
|  615 | root                        | localhost                       | appws30 | Query   |  255 | waiting for handler commit                             | INSERT INTO `onlineord                                                            er_attachments` (`AttachmentGUID`,`Filename`,`File`) VALUES  ('44a2b54f-b0cf-4 |
| |
+------+-----------------------------+---------------------------------+----------+---------+------+--------------------------------------------------------+-----------------------                                                            -------------------------------------------------------------------------------+

测试用例:

对于没有InnoDB Cluster 配置的正常 MySQL 8.0 安装,INSERT 有效。

对于具有 InnoDB Cluster 配置但集群中只有一台主机的 MySQL 8.0,INSERT 也可以工作。

只有具有 InnoDB Cluster Configuration 和更多主机INSERT 的 MySQL 8.0 在死锁中运行。

我们忘记了设置还是这是一个错误?

4

1 回答 1

1

Mysql 服务器之间是一个 10MBit/s 的 LAN。结果,MySQL 数据库复制似乎在较大的文件上超时,导致事务回滚,进而导致表锁定。

使用 100MBit/s 的 LAN,经过多次测试后不会出现错误。只有这有帮助。slave_net_timeout 的增加也没有帮助。

为什么在异步复制中超时会导致主服务器上的表锁定在我看来没有意义。

更新: 对于 100MBit/s 的 LAN,现在对于大于约 20MB 的文件会发生错误。由于我们不想在数据库中存储任何大于 16 MB 的文件,我们只需将最大 SQL 数据包大小设置为 16 MB。这会导致错误代码1301“...大于max_allowed_pa​​cket ...”直接输出到更大文件的INSERT,从而防止表锁。

max_allowed_packet = 16777216

更新 2:

cluster.setOption("expelTimeout", 3600); 

并在 /etc/mysql/mysql.conf.d/mysqld.cnf 中设置 group_replication_transaction_size_limit 部分有帮助。

group_replication_transaction_size_limit = 0 #0=Maximum=2147483647=2GB

最终解决方案: 当较大的文件存储在表中时,MySQL 复制似乎通常会出现问题。因此,我们更改了我们的应用程序,以便所有文件都保存在文件系统中,而 MySQL 表只存储文件密钥和其他文件信息。我们创建了自己的解决方案,用于在多台机器上复制文件。

于 2019-11-12T14:22:58.220 回答