PS:此脚本简单易懂,根据实际情况修改个别参数测试后即可使用,如有错误请指出!
1.MySQL数据库备份脚本
#!/bin/bash
user=
pw=
ip=
dateY=`date "+%Y"`
date2=`date "+%Y%m%d"`
date3=`date "+%Y%m%d %H:%M"`
date4=`date "+%d"`
date_ago=`date -d "-3 day" +%d`
data=./data
delete_db=./db_and_tables/old_db
new_db=./db_and_tables/new_db
delete_table_path=./db_and_tables
#---------------------------------------------------------------------------------#
#查询数据库输出到文件删除不需要的数据库并生成文件夹;
/usr/local/mysql/bin/mysql -u$user -p$pw -h$ip -e "show databases" > $new_db
for i in `cat $delete_db`
do
sed -i "/$i/d" $new_db
done
if [ ! -d "$data/$date4" ]
then
mkdir -p $data/$date4
fi
for q in `cat $new_db`
do
if [ ! -d "$data/$date4/$q" ]
then
mkdir -p $data/$date4/$q
fi
done
#---------------------------------------------------------------------------------#
#查询表并输出到相应文件中;
for w in `cat $new_db`
do
/usr/local/mysql/bin/mysql -u$user -p$pw -h$ip -e "use $w ; show tables" > $delete_table_path/${w}_table
#删除3天前的备份
rm -rf $data/$date_ago
done
for e in `cat $new_db`
do
for t in `cat $delete_table_path/${e}_list_structure`
do
sed -i "/\<$t\>/d" $delete_table_path/${e}_table
done
#根据过滤条件过滤掉不需要的表;
sed -i "/2022/d" $delete_table_path/${e}_table
sed -i "/$dateY/d" $delete_table_path/${e}_table
sed -i "/Tables_in_*/d" $delete_table_path/${e}_table
done
#---------------------------------------------------------------------------------#
#备份表
for ((s=1;s<2;s++))
do
db_structure=`cat ${new_db} | awk "NR==$s"`
for a in `cat $delete_table_path/${db_structure}_list_structure`
do
echo "$date3 --- 导出 --- $db_structure --- $a --- 表结构" >> ./out.out
/usr/local/mysql/bin/mysqldump -u$user -p$pw -h$ip -d $db_structure $a > $data/$date4/$db_structure/${a}_${date2}.sql
done
done
#---------------------------------------------------------------------------------#
#备份数据
for ((d=1;d<2;d++))
do
db_data=`cat ${new_db} | awk "NR==$d"`
for b in `cat $delete_table_path/${db_data}_table`
do
echo "$date3 --- 导出 --- $db_data --- $b --- 数据" >> ./out.out
/usr/local/mysql/bin/mysqldump -u$user -p$pw -h$ip $db_data $b > $data/$date4/$db_data/${b}_${date2}.sql
done
done
2.脚本结构解释
[root@bj-1-77 12]# ls
data db_and_tables out.out script.sh
[root@bj-1-77 12]# ls db_and_tables/
monitor_caiji_list_structure old_db
- data:是个文件夹,用于存储备份下来的数据;
- db_and_tables:是个文件夹,用于存储脚本中需要的配置参数;
- old_db :存储不需要备份的数据库;脚本会通过此配置从而生成需要备份数据库的新文件new_db;
- monitor_caiji_list_structure:在执行脚本前将不需要备份表的表名写入此文件中,执行脚本后会生成新文件monitor_caiji_table,文件名命名规则:({数据库名称}_list_structure);
- out.out:脚本执行后输出的日志记录;
- 脚本中for ((d=1;d<2;d++)) 2为备份数据库的总数+1;
3.脚本执行效果
PS:环境:
- 数据库:monitor_caiji
- 备份的表:video_brief、video_list
- 不备份的表:mblog_info
[root@bj-1-77 12]# ls
data db_and_tables out.out script.sh
#备份下的数据
[root@bj-1-77 12]# ls data/09/monitor_caiji/
video_brief_20230509.sql video_list_20230509.sql
[root@bj-1-77 12]# ls db_and_tables/
monitor_caiji_list_structure monitor_caiji_table new_db old_db
[root@bj-1-77 12]# cd db_and_tables/
#不备份的数据库
[root@bj-1-77 db_and_tables]# cat old_db
Database
information_schema
mysql
performance_schema
sys
#需要备份的数据库
[root@bj-1-77 db_and_tables]# cat new_db
monitor_caiji
#不备份的数据表
[root@bj-1-77 db_and_tables]# cat monitor_caiji_list_structure
mblog_info
#需要备份的数据表
[root@bj-1-77 db_and_tables]# cat monitor_caiji_table
video_brief
video_list
#日志
[root@bj-1-77 12]# tail -f out.out
20230509 02:00 --- 导出 --- monitor_caiji --- video_brief --- 数据
20230509 02:00 --- 导出 --- monitor_caiji --- video_list --- 数据