如何备份MySQL数据库且每张表仅导出20行数据
导出MySQL全量对象+每张表20行数据的实现方案
方案1:单行mysqldump命令实现(推荐)
直接利用mysqldump的全局--where参数限制所有表的返回行数,同时追加参数导出存储过程、触发器、事件等所有数据库对象:
mysqldump -u [数据库用户名] -p --databases [目标数据库名] \ --routines --triggers --events \ --where="1 LIMIT 20" > mysql_backup.sql
注意事项:
- 命令中
-p后不要加密码,执行时会交互式输入密码,避免密码泄露到bash历史记录中 - 该命令会导出完整的表结构、视图定义、存储过程、自定义函数、触发器、事件调度器,所有业务表仅导出前20行数据
- 如果需要固定导出的20行排序规则,可将
--where参数修改为--where="1 ORDER BY 主键字段名 LIMIT 20"
方案2:shell脚本实现(灵活度更高)
如果需要跳过指定表、或给不同表设置不同的行数限制,可使用脚本分步骤导出:
#!/bin/bash # 配置项 DB_USER="你的数据库用户名" DB_NAME="目标数据库名" BACKUP_FILE="./mysql_backup.sql" ROW_LIMIT=20 # 第一步:导出全量结构和非表对象 mysqldump -u${DB_USER} -p ${DB_NAME} \ --no-data --routines --triggers --events > ${BACKUP_FILE} # 第二步:逐表导出指定行数的数据 for table in $(mysql -u${DB_USER} -p ${DB_NAME} -e "SHOW TABLES;" | sed '1d'); do mysqldump -u${DB_USER} -p ${DB_NAME} ${table} \ --no-create-info --where="1 LIMIT ${ROW_LIMIT}" >> ${BACKUP_FILE} done
方案优势:
- 可在遍历表的逻辑中加过滤规则,跳过不需要导出数据的系统表、日志表
- 可针对大表单独调整行数限制,适配特殊导出需求
导出结果校验
执行以下命令统计每张表的INSERT语句行数,确认是否符合限制要求:
grep "INSERT INTO" mysql_backup.sql | awk -F '`' '{print $2}' | uniq -c
内容的提问来源于stack exchange,提问作者Noorulhoda
相关产品推荐
相关产品推荐

