能,但默认导出后分区结构丢失;需用--no-create-info导数据、-d导含PARTITION BY的建表语句,或手动保留结构;跨分区导出须查INFORMATION_SCHEMA.PARTITIONS确定边界再WHERE过滤。
mysql
dump 能直接备份分区表吗?
能,但默认行为会把整个分区表当普通表导出,
语句里不带
子句,恢复后变成非分区表——数据还在,结构丢了。
关键在加
和手动保留建表语句,或者用
配合单独导出表结构。
导结构(含分区定义):
导数据(跳过建表):
注意:
不会导触发器,
是防误触,不是必须;但分区表一般没触发器,可省
按分区名单独导出某个分区的数据
MySQL 原生
不支持
按分区逻辑过滤,它只认 WHERE 条件,而分区键值可能跨多个列、或涉及函数(如
),直接写 WHERE 容易漏数据或报错。
更可靠的做法是:先查出目标分区的边界值,再用
精确限定范围导出。
查分区信息:
对 RANGE 分区,
是上界值(如
),实际数据范围是前一分区上界
导出示例(假设
是分区键,
对应
):
合并多个分区 SQL 文件时要注意什么
直接
很危险:如果各文件都含
或
,会互相覆盖;若结构不一致(比如字段顺序、默认值、分区表达式不同),导入中途就失败。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
必须保证:只有一个文件负责建表(且含完整分区定义),其余只导入数据。
检查每个
文件头,删掉重复的
和
(保留第一个即可)
确认所有数据文件的
语句字段顺序与建表语句一致;如有
显式指定列,没问题;若用
,必须严格对齐
导入前先清空目标表(用
,别用
,避免锁表和 binlog 膨胀)
分区表用
导出的坑
这个命令不走客户端,是 MySQL Server 直接写服务器本地磁盘,路径是相对于 MySQL 的
目录——不是你当前 shell 的工作目录,也不是任意路径。
而且它不生成建表语句,也不处理字符集自动转换,导出的文本文件缺字段元信息,后续加载容易乱码或列错位。
查允许路径:
,结果为空表示禁用,非空则必须用该路径下的子路径
导出时显式指定字段:
导入需对应
,且必须确保目标表已存在、分区已定义好;不能用
,它不识别分区语法
分区表导出最麻烦的从来不是“怎么拿数据”,而是“怎么让结构和数据在另一环境严丝合缝地重建”。尤其跨版本迁移时,5.7 和 8.0 对
表达式的解析可能有细微差异,光靠 dump 文件不一定保得住。真要稳妥,建议把
输出和
导出分开存,人工核对一次分区定义。
CREATE TABLEPARTITION BY--skip-create-options--no-create-infomysqldump -d --no-data db_name table_name > schema.sqlmysqldump -t --skip-triggers db_name table_name > data.sql-t--skip-triggersmysqldump--whereTO_DAYS(created_at)WHERESELECT PARTITION_NAME, TABLE_ROWS, PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'your_table' AND TABLE_SCHEMA = 'db_name';PARTITION_DESCRIPTION1000 当前上界log_datep202404VALUES LESS THAN ('2024-05-01')mysqldump db_name your_table --where="log_date >= '2024-04-01' AND log_date p202404.sqlcat *.sql | mysqlDROP TABLECREATE TABLE.sqlCREATE TABLEDROP TABLEINSERTINSERT INTO t(col1,col2) VALUESINSERT INTO t VALUESTRUNCATE TABLEDELETESELECT ... INTO OUTFILEsecure_file_privSHOW VARIABLES LIKE 'secure_file_priv';SELECT * FROM t PARTITION(p202404) INTO OUTFILE '/var/lib/mysql-files/p202404.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';LOAD DATA INFILEmysqlimportPARTITION BY HASHSHOW CREATE TABLESELECT