mysql 8.0.x
使用Mysql导数据的时候发现如下报错:
mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `t20230811_0` at row:0
14:57:58 [root@ddcw21 ~]#mysqldump -h127.0.0.1 -P3314 -p123456 --all-databases --single-transaction --master-data --quick > alldb_t20230811.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `t20230811_0` at row: 0
报错的意思是: 表结构变了, 表名是 t20230811_0
也就是说在导出数据的时候, 有人对这张表执行了DDL.
使用我们之前的提取binlog里面的DDL语句的方法验证下, 发现确实有大量的DDL(其实是我模拟的... 但我也要假装吃惊)
等下班了(没得业务)再导出数据即可....
在生产中一般不会碰到这种频繁创建和删除表的操作的, 而且备份也多半是在凌晨没得业务的时候做的, 所以还是很难遇到的.
至于为啥要一直create然后drop 我就不知道了, 而且表数据量也不大, 完全可以扔给redis啊 -_-
如下为python编写的简单的模拟脚本
import pymysql
def runsql(conn,sql):
cursor = conn.cursor()
cursor.execute(sql)
data = cursor.fetchall()
cursor.close()
conn = pymysql.connect(
host='127.0.0.1',
port=3314,
user='root',
password='123456',
)
while True:
for table_n in range(10):
table_name=f'db1.t20230811_{table_n}'
ddl = f'create table if not exists {table_name}(id int, name varchar(20));'
runsql(conn,ddl)
for i in range(1000):
runsql(conn,f'insert into {table_name} values({i},"aa")')
runsql(conn,'commit')
for i in range(1001,2000):
runsql(conn,f'insert into {table_name} values({i},"aa")')
runsql(conn,'commit')
for table_n in range(10):
table_name=f'db1.t20230811_{table_n}'
runsql(conn,f'drop table {table_name}')
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。