shell脚本备份mysql数据表(分表备份)

一键备份MySQL数据库
本文介绍了一个用于一键备份MySQL数据库所有表的Shell脚本。通过简单的配置,如数据库地址、用户名、密码等信息,即可实现对指定数据库下所有数据表的备份。

    有时候不仅需要备份指定的数据表,还需要备份数据库中的所有数据表,直接上代码。

#!/bin/bash
HOST=127.0.0.1         #ip地址
USER=LGL               #数据库用户名
PASSWORD=123           #数据库密码
DATABASE=backup        #数据库名字
BACKUP_PATH=/home/lgl/bkdata           #备份路径
logfile=/home/lgl/bkdata/data.log      #日志路径
 
DATE=`date '+%Y%m%d'`    #当前日期

#如果不存在该目录,就创建
if [ ! -d $BACKUP_PATH ]
then
mkdir -p "$BACKUP_PATH"
fi

#连接mysql数据库
mysql -h $HOST -u $USER -p$PASSWORD -s $DATABASE <<EOF
drop table if exists a;
create table a (
id int(10) not null,
name varchar(10) not null
);
insert into a values(2016,'LiuBei');
insert into a values(2017,'GuanYu');
insert into a values(2018,'ZhangFei');
 
drop table if exists b;
create table b (
id int(10) not null,
name varchar(10) not null
);
insert into b values(2019,'CaoCao');
insert into b values(2020,'ZhangLiao');
insert into b values(2021,'XuChu');
EOF
if [ $? -ne 0 ]
then
echo "Init data fail!">>$logfile
exit 4
fi
echo "Init data Successful!">>$logfile
 
#进入到备份目录
cd $BACKUP_PATH
#遍历数据库中的数据表
for table in $DATABASE
do
#获取表名
table=$(mysql -h $HOST -u $USER -p$PASSWORD $DATABASE -e "show tables;"|sed '1d')
for tb in $table
do
DUMPNAME=""$tb"_"$DATE".sql" #备份文件名
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE $tb> $DUMPNAME
if [ $? = 0 ] 
then
echo "$DUMPNAME backup Successful!">>$logfile
else
echo "$DUMPNAME backup fail!" >>$logfile
fi
done
done
if [ $? = 0 ] 
then
echo "backup all tables Successful">>$logfile
else
echo "backup all tables fail!">>$logfile
exit 4
 
fi

注意:在linux下运行./test.sh时,即使代码没错,可能也会报错误,因为格式不对,只需要执行 dos2unix test.sh即可。sed '1d'表示删除show tables时出现的第一行。即   Tables_in_backup 这一行。

用for循环来遍历出数据库下所有的数据表,依次使用mysqldump导出到指定文件中。

 

 

 

 

<think>好的,用户的问题是关于在shell脚本使用mysqldump进行MySQL数据库备份时遇到的问题及解决方法,特别是如何正确调用mysqldump。我需要先回忆一下常见的错误和解决方案,然后结合提供的引用内容来组织答案。 首先,用户可能遇到的一些典型问题包括权限问题、密码安全、路径错误、备份文件覆盖等。根据引用内容,引用[2]提到在脚本中直接使用-p参数加上密码,但这样会有安全隐患,应该如何处理呢?可能需要建议使用配置文件或者交互式输入密码,但如何在脚本中处理呢? 另外,引用[2]中的示例脚本使用了创建日期目录的方法,这可以避免文件覆盖,但用户可能没有正确设置目录权限导致备份失败。还有,mysqldump命令的路径问题,如果不在环境变量中,可能需要写全路径。 然后,我需要确保回答的结构清晰,分步骤说明正确的方法,并列举常见问题及解决方法。可能还需要提到如何将脚本加入crontab定时任务,如引用[2]和引用[4]提到的内容。 还要注意密码的安全性问题,比如在命令行中显示密码可能被其他用户通过ps命令看到,所以建议使用配置文件或隐藏密码。引用[3]中的基本用法展示了用户名和密码的参数,但需要指出安全隐患。 另外,备份整个数据库和多个数据库的情况,引用[2]中的脚本使用了-B参数,可能需要解释-B的作用,以及如何扩展备份多个库。 最后,生成相关问题需要考虑用户可能的后续疑问,比如定时任务设置、增量备份备份验证等。 现在需要将这些点整合成一个结构化的回答,分步骤说明正确方法,列举常见问题并提供解决方案,同时引用提供的参考文献中的内容,比如引用[2]中的脚本示例,引用[3]的基本用法,引用[4]提到的Java调用Shell脚本等作为扩展参考。</think>### 逐步解答:如何在Shell脚本中正确调用mysqldump进行MySQL备份 --- #### **一、基础备份命令** 在Shell脚本使用mysqldump备份数据库的标准语法为: ```shell mysqldump -h [主机地址] -P [端口] -u [用户名] -p[密码] [数据库名] > [备份文件路径] ``` 示例(备份单个数据库): ```shell mysqldump -h 127.0.0.1 -P 3306 -uroot -p123456 -B testdb > /backup/testdb.sql ``` 关键参数说明: - `-B`:指定数据库名称,并生成`CREATE DATABASE`语句,便于恢复[^2] - `>`:将输出重定向到文件 --- #### **二、完整备份脚本实现** 参考引用[2]中的脚本优化版本: ```shell #!/bin/bash # 定义日期格式和备份目录 datename=$(date +%Y%m%d%H%M) dayname=$(date +%Y%m%d) backup_dir="/mnt/backup/db/$dayname" # 创建当日备份目录 mkdir -p "$backup_dir" # 备份命令(建议使用配置文件避免明文密码) mysqldump --defaults-extra-file=/path/to/my.cnf -h 127.0.0.1 -P 3306 -uroot testdb > "$backup_dir/testdb_$datename.sql" # 多数据库备份示例 # mysqldump --defaults-extra-file=/path/to/my.cnf -B db1 db2 > "$backup_dir/multi_db_$datename.sql" ``` --- #### **三、常见问题及解决方法** | **问题类型** | **表现/原因** | **解决方案** | |--------------------|---------------------------------------|-----------------------------------------------------------------------------| | **权限不足** | `Access denied for user` | 1. 检查MySQL用户权限:`GRANT LOCK TABLES, SELECT ON *.* TO 'user'@'host'`[^3]<br>2. 使用`sudo`执行脚本 | | **密码安全隐患** | 命令行中明文显示密码 | 1. 使用配置文件:`[mysqldump] user=root password=123456`[^3]<br>2. 设置配置文件权限为`600` | | **备份文件覆盖** | 多次备份后文件被覆盖 | 1. 在文件名中添加时间戳(如示例中的`$datename`)<br>2. 使用增量备份策略 | | **路径不存在** | `No such file or directory` | 1. 使用`mkdir -p`自动创建目录(如示例)<br>2. 检查磁盘空间和挂载点 | | **锁表失败** | 备份导致数据库写入阻塞 | 添加`--single-transaction`参数(仅限InnoDB) | | **大表备份失败** | 备份超时或内存不足 | 1. 使用`--quick`参数<br>2. 分表备份 | --- #### **四、高级技巧** 1. **密码安全管理** ```shell # 创建配置文件(/path/to/my.cnf) [mysqldump] user=root password=123456 host=127.0.0.1 # 脚本中调用 mysqldump --defaults-extra-file=/path/to/my.cnf testdb > backup.sql ``` *配置文件权限需设置为`chmod 600 /path/to/my.cnf`[^3]* 2. **定时任务配置** ```shell # 编辑crontab crontab -e # 每天凌晨2点执行备份 0 2 * * * /bin/bash /path/to/backup_script.sh ``` *需测试脚本在cron环境下的路径问题* --- #### **五、备份验证** 1. 检查备份文件大小:`ls -lh /backup` 2. 模拟恢复测试: ```shell mysql -uroot -p testdb < /backup/testdb.sql ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值