前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MYSQL案例][013] mysqldump报错 Error 1412: Table definition has changed

[MYSQL案例][013] mysqldump报错 Error 1412: Table definition has changed

原创
作者头像
大大刺猬
发布2023-08-11 15:21:57
1.5K0
发布2023-08-11 15:21:57
举报
文章被收录于专栏:大大刺猬

环境

mysql 8.0.x

问题

使用Mysql导数据的时候发现如下报错:

mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `t20230811_0` at row:0

代码语言:javascript
复制
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编写的简单的模拟脚本

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 问题
  • 分析
  • 解决办法
  • 总结
  • 附模拟脚本
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档