MySQL数据库备份脚本

PS:此脚本简单易懂,根据实际情况修改个别参数测试后即可使用,如有错误请指出!

1.MySQL数据库备份脚本

#!/bin/bash

#---------------------------------------------------------------------------------#
#Config
user=root
pw=isiteam
ip=192.168.1.105
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
date_year=`date -d "-1 year"  +%Y`
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 c in `cat $new_db`
	do
		#创建用于填写备份表的文件
		if [ ! -d "$delete_table_path/${c}_table" ]
		then
			touch $delete_table_path/${c}_table 
		fi
		#创建不备份填写表的文件
		if  [ ! -d "$delete_table_path/${c}_list_structure"  ]
		then
			touch $delete_table_path/${c}_list_structure 
		fi
	done
	#在每日文件夹内创建数据文件
	for q in `cat $new_db`
	do
		if [ ! -d "$data/$date4/$q" ]
		then
			mkdir -p $data/$date4/$q
		fi
	done

#---------------------------------------------------------------------------------#

	echo "到此库表文件已通过脚本自动化在 ${delete_table_path} 目录中创建完成,自行将不需要备份的表名填写到对应的文件中(表名_list_structure),然后编辑脚本注释掉此块代码正常运行即可!"
	exit

#---------------------------------------------------------------------------------#
#查询表并输出到相应文件中;
	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 "/$date_year/d" $delete_table_path/${e}_table
		sed -i "/Tables_in_*/d" $delete_table_path/${e}_table
	done
#---------------------------------------------------------------------------------#
#备份表
	#需要备份表的总数+1
	number1=`expr $(cat $delete_table_path/new_db |wc -l ) + 1`
	for ((s=1;s<$number1;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
#---------------------------------------------------------------------------------#
#备份数据
	#需要备份表的总数+1
	number2=`expr $(cat $delete_table_path/new_db |wc -l ) + 1`
	for ((d=1;d<$number2;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<$number2;d++)) $number2为备份数据库的总数+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   mblog_info_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 ---  mblog_info--- 表结构
20230509 02:00 ---  导出 --- monitor_caiji ---  video_brief --- 数据
20230509 02:00 ---  导出 --- monitor_caiji ---  video_list --- 数据

你可能感兴趣的:(Linux系列,MySQL,mysql,数据库,服务器,linux)