总结
1,解决mysql密码包含特殊字符的问题:
正常命令形如: mysqldump -u root -p 你的密码
包含特殊字符形如: mysqldump -u root --password='你的密码'
2,解决指定字符开头的问题和压缩问题:
压缩:mysqldump -u root --password='你的密码' 数据库名 $(mysql -u root --password='你的密码' 数据库名 -Bse "show tables like '指定开头的字符%'") | gzip > backup-$(date "+%Y-%m-%d").sql.gz
不压缩:mysqldump -u root --password='你的密码' 数据库名 $(mysql -u root --password='你的密码' 数据库名 -Bse "show tables like '指定开头的字符%'") > backup-$(date "+%Y-%m-%d").sql
3,java代码
public void backupDB() throws Exception {
String[] cmd = new String[] {"/bin/sh", "-c", ""};
try {
StringBuilder arg = new StringBuilder();
arg.append("mysqldump ");
arg.append("-u root ");
arg.append("--password='可带有特殊字符的密码' ");
arg.append("--default-character-set=utf8 "); // 指定字符集
arg.append("--skip-opt "); // 禁用将结果存入内存,否则大表会出现问题
arg.append("--add-drop-database "); // 在CREATE DATABASE之前加 drop语句
arg.append("--compress "); // 压缩传输的信息
arg.append("--databases 数据库名 "); // 指定数据库
arg.append("--tables $(mysql -u root --password='可带有特殊字符的密码' 数据库名 -Bse \"show tables like '指定开头的字符%'\") "); // 指定表
arg.append("--result-file /root/dbbackup/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() + ".sql"); // 文件路径+ 文件名
cmd[2] = arg.toString();
Process process = Runtime.getRuntime().exec(cmd);
boolean exitValue = process.waitFor(20, TimeUnit.SECONDS); // 最多等待20s
if (!exitValue) {
throw new Exception("执行命令[" + JSON.toJSONString(cmd) + "]超时");
}
} catch (Throwable e) {
log.error("执行命令[" + JSON.toJSONString(cmd) + "]失败. " + e);
throw new Exception(e);
}
}
4,多个表的时候,如何处理
举例:show tables from stock_db where tables_in_stock_db
like ‘biz_%’ or tables_in_stock_db
like ‘st_%’
SHOW TABLES
FROM `<yourdbname>`
WHERE
`Tables_in_<yourdbname>` LIKE '%cms%'
OR `Tables_in_<yourdbname>` LIKE '%role%';
一些参考:
1,mysqldump命令详解:https://www.jianshu.com/p/aaffa08e7853
2,Java程序在运行cmd命令mysqldump的时候失效的原因:https://blog.csdn.net/weixin_40920882/article/details/106362953
3,https://stackoverflow.com/questions/5609620/show-tables-statement-with-multiple-like-values