Mysqldump 备份说明及数据库备份脚本分享-运维笔记

Mysqldump 备份说明及数据库备份脚本分享-运维笔记

 

MySQLdump是MySQL自带的导出数据工具,即mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中。Mysqldump是一个客户端逻辑备份的工作,备份的SQL文件可以在其他MySQL服务器上进行还原。

如需备份,则至少需要对该表的select权限,需要备份视图则需要改账户具有SHOW VIEW权限,触发器需要TRIGGER。如需锁表,则不可使用--single-transaction选项。其他权限暂未列出。
如需还原,则需要对应的执行权限,如create表,则需要对该库的create权限。

Mysqldump导出可以包括ALTER DATABASE与相关更改,其中包括导出元数据、更改字符编码,在导入对应文件时,相应的权限更改也会发生影响。如果在服务器上备份的表均为MyISAM,也可以使用mysqlhotcopy来完成任务。

从性能和伸缩性考虑,mysqldump的优势包括:在输出之前可以很方便的查看或编辑文件,你还可以克隆数据库与DBA的工作,或者将生产环境下的数据进行微小测试。这不是作为快速备份或可伸缩性很强的方案。即针对不同大小的数据需要安排合理时间,在需要还原时速度并不快,因为需要重新进行I/O、创建索引等。

对于大量数据来说,物理备份可能更为合适,因为它可以快速还原。

- 如果你的表以Innodb引擎为主,可以考虑使用MySQL的mysqlbackup命令。因为他提供了最好的Innodb备份:它也可以备份其他如MyIsAM与其他存储引擎;提供了更多的备份参数进行选择。详情见手册 25.2 “MySQL Enterprise Backup Overview”

- 如果你的表以MyISAM引擎为主,可以考虑使用mysqlhotcopy来替代,它可能比mysqldump表现更为好,详情见mysqlhotcopy手册。

Mysqldump可以行级导出数据,或者也可以将整个表载入内存一次性导出,如果将所有数据导入内存可能会面临内存缓冲区不够的问题。如果要行级导出数据,使用--quick选项(或者--opt,它支持--quick)。--opt选项是默认选项,所以为了保证内存缓冲区,使用--skip-quick。

如果使用高版本的mysqldump来备份一个低版本的MySQL服务器中的数据,使用--skip-opt代替--opt或者-- extended-insert选项。

下面对它的使用进行总结性梳理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
查询该命令的帮助信息(有很多参数,具体也可以man一下)
[root@Mysql-node1 ~]# mysqldump --help
 
常用的几个选项
--add-drop-table:在每个创建数据库表语句前添加删除数据库表的语句;
--add-locks:备份数据库表时锁定数据库表;
--all-databases(即-A):备份MySQL服务器上的所有数据库;
--comments:添加注释信息;
--compact:压缩模式,产生更少的输出;
--complete-insert:输出完成的插入语句;
--databases(即-B):指定要备份的数据库;
--default-character-set:指定默认字符集;
--force(即-f):当出现错误时仍然继续备份操作;
--host:指定要备份数据库的服务器;
--lock-tables:备份前,锁定所有数据库表;
--no-create-db:禁止生成创建数据库语句;
--no-create-info:禁止生成创建数据库库表语句;
--password:连接MySQL服务器的密码;
--port:MySQL服务器的端口号;
--user:连接MySQL服务器的用户名。
--no-data(即-d):只导出表结构。
--quick,(即-q):快速导出。
--xml,(即-X):导出为xml文件。
--tables:覆盖 --databases or -B选项,后面所跟参数被视作表名。
--default-character-set,字符集设置。比如--default-character-set=gb2312、--default-character-set=utf8

参数--lock-tables 表示的是一次性锁定当前库的所有表, 而不是锁定当前导出表! 例如:
# mysqldump -u root -p --default-character-set=utf8 --opt --extended-insert=false --lock-tables MyDB > db_backup_MyDB.sql 

实例说明:

1)导出、导入所有的库(--all-databases,  -A   导出全部数据库)

1
2
3
4
5
6
7
8
9
10
导出所有的库
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 --all-databases >/opt/all.sql
Warning: Using a password on the command line interface can be insecure.
 
导入所有的库
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/all.sql               
Warning: Using a password on the command line interface can be insecure.
 
或者
mysql> source /opt/all.sql;

2)导出、导入某个库(比如kevin库)

1
2
3
4
5
6
7
8
9
10
11
导出kevin库
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 kevin > /opt/kevin.sql
Warning: Using a password on the command line interface can be insecure.
 
导入kevin库(前提是kevin库要存在,如果没有,在导入前先创建kevin空库)
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin.sql
Warning: Using a password on the command line interface can be insecure.
 
或者
mysql> use kevin;
mysql> source /opt/all.sql;

3)导出、导入某几个库(比如kevin、grace库)(--databases, -B 导出部分数据库)

1
2
3
4
5
6
7
8
9
10
导出kevin、grace库
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -B kevin grace > /opt/kevin_grace.sql
Warning: Using a password on the command line interface can be insecure.
 
导入kevin、grace库(多个库的导入、恢复数据操作,不需要要求这些库必须存在,如没有存在,不需要提前创建这些空库)
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/kevin_grace.sql                  
Warning: Using a password on the command line interface can be insecure.
 
或者
mysql> source /opt/kevin_grace.sql;

4)导出、导入某个库的某些表数据

1
2
3
4
5
6
7
8
9
10
11
12
导出kevin库的haha、heihei表数据(可以在导出时加--add-locks参数,表示导出时锁定数据库表;这里没有添加)
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 kevin haha heihei > /opt/kevin_hahei.sql        
Warning: Using a password on the command line interface can be insecure.
 
导入kevin库的haha、heihei表数据(要保证kevin库真实存在,如果没有,需要提前创建)
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_hahei.sql
Warning: Using a password on the command line interface can be insecure.
 
或者
mysql> use kevin;
Database changed
mysql> source /opt/kevin_hahei.sql;

5)只导出数据库结构,不导出数据(--no-data, -d  只导出表结构,不导出表数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
导出kevin库下所有的表结构(不导出表数据)(去掉下面的--add-drop-table参数也可以)
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -d --add-drop-table kevin > /opt/kevin_table.sql           
Warning: Using a password on the command line interface can be insecure.
  
导入kevin库的表结构(前提要保证kevin库真实存在)
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_table.sql
Warning: Using a password on the command line interface can be insecure.
  
或者
mysql> use kevin;
Database changed
mysql> source /opt/kevin_table.sql;
  
----------------------------------------------------------------------------------------------------
如果是导出某个库下的一个或几个表结构(不包括表数据),命令如下(加不加--add-drop-table参数都可以):
[root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -d kevin haha heihei > /opt/kevin_table_2.sql             
Warning: Using a password on the command line interface can be insecure.
 
导入上面备份的数据时,要保证kevin提前真实存在。
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_table_2.sql
Warning: Using a password on the command line interface can be insecure.

6)完整导出时过滤掉某些库(使用--databases,而不是--all-databases)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
如下在导出整个数据库时,过滤掉information_schema、mysql、test、performance_schema这几个库
[root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database"                                     
information_schema
grace
kevin
mysql
performance_schema
test
 
[root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database|information_schema|mysql|test|performance_schema"
grace
kevin
 
[root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database|information_schema|mysql|test|performance_schema"|xargs mysqldump -uroot -p123456 --databases > /opt/mysql_dump.sql
 
导入上面备份的库(这些库不需要真实存在,恢复时如果库不存在,会自动创建)
[root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/mysql_dump.sql
Warning: Using a password on the command line interface can be insecure.
 
或者:
mysql> source /opt/kevin_grace.sql;

                                                                       Mysqldump日常操作语句集锦                                                                    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
mysqldump的几种常用方法:
1)导出整个数据库(包括数据库中的数据)
mysqldump -u username -p dbname > dbname.sql  
   
2)导出数据库结构(不含数据)
mysqldump -u username -p -d dbname > dbname.sql  
   
3)导出数据库中的某张数据表(包含数据)
mysqldump -u username -p dbname tablename > tablename.sql  
   
4)导出数据库中的某张数据表的表结构(不含数据)
mysqldump -u username -p -d dbname tablename > tablename.sql 
   
=============================================================================
mysqldump常用参数说明(适用于mysql 5.6版本, mysql 5.7版本有的就不太适用了)
 
--all-databases , -A 导出全部数据库
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql
  
--all-tablespaces , -Y导出全部表空间。(-y不导出任何表空间信息)
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --all-tablespaces --no-tablespaces > /root/db.sql
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --no-tablespaces > /root/db.sql
   
--add-drop-database每个数据库创建之前添加drop数据库语句。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --add-drop-database > /root/db.sql
   
--add-drop-table每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项)
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases   > /root/db.sql          #默认添加drop语句
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-add-drop-table > /root/db.sql      #取消drop语句
   
--add-locks在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql       #默认添加LOCK语句
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-add-locks   > /root/db.sql       #取消LOCK语句
   
--comments附加注释信息。默认为打开,可以用--skip-comments取消
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases  > /root/db.sql         #默认记录注释
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-comments  > /root/db.sql     #取消注释
   
--compact导出更少的输出信息(用于调试)。去掉注释和头尾等结构。
可以使用选项:--skip-add-drop-table 、--skip-add-locks、--skip-comments、--skip-disable-keys
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --compact > /root/db.sql
  
--complete-insert, -c使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --complete-insert > /root/db.sql
   
--compress, -C在客户端和服务器之间启用压缩传递所有信息
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --compress > /root/db.sql
   
--databases, -B导出几个数据库。参数后面所有名字参量都被看作数据库名。
[root@Mysql-node1 ~]# mysqldump -uroot -p --databases test mysql > /root/db.sql
 
--debug-info输出调试信息并退出
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --debug-info > /root/db.sql
   
--default-character-set设置默认字符集,默认值为utf8
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --default-character-set=utf8 > /root/db.sql
   
--delayed-insert采用延时插入方式(INSERT DELAYED)导出数据
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --delayed-insert > /root/db.sql
   
--events, -E导出事件。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --events > /root/db.sql
   
--flush-logs开始导出之前刷新日志。请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。
除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新
日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --flush-logs > /root/db.sql
   
--flush-privileges在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql
数据库数据的任何时候。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --flush-privileges > /root/db.sql
   
--force在导出过程中忽略出现的SQL错误。
[root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --force > /root/db.sql
   
--host, -h需要导出的主机信息
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases > /root/db.sql
   
--ignore-table不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user > /root/db.sql
   
--lock-all-tables, -x提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables > /root/db.sql
   
--lock-tables, -l开始导出前,锁定所有表。用READ LOCAL锁定表以允许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个
更好的选择,因为它根本不需要锁定表。请注意当导出多个数据库时,--lock-tables分别为每个数据库锁定表。因此,该选项不能保证导出文件中的表在数据库之间
的逻辑一致性。不同数据库表的导出状态可以完全不同。
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --lock-tables > /root/db.sql
   
--no-create-db, -n只导出数据,而不添加CREATE DATABASE 语句。
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-create-db > /root/db.sql
   
--no-create-info, -t只导出数据,而不添加CREATE TABLE 语句。
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-create-info > /root/db.sql
   
--no-data, -d不导出任何数据,只导出数据库表结构。
[root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-data > /root/db.sql

                                                                    备份Mysql数据库的通常使用命令                                                         

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1)备份kevin库 (两种方法)
# mysqldump --single-transaction --master-data=2 --triggers --routines --database kevin -uroot -p123456 > /root/kevin.sql
# mysqldump -uroot -p123456 -B -F -R -x --master-data=2 kevin|gzip >/opt/backup/kevin_$(date +%F).sql.gz
 
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
 
这里稍微注意下:
mysql5.6使用mysqldump备份时,指定备份的具体库,使用--database
mysql5.7使用mysqldump备份时,指定备份的具体库,使用--databases
 
2)备份整个数据库(基于打开GTID功能的Mysql)。下面这两种备份方法中,不能在下面命令中添加具体的库,比如kevin库
# mysqldump -u root -p'123456' --lock-all-tables --master-data=2 --flush-logs --all-databases --triggers --routines --events > 205_slave.sql
# mysqldump -uroot -p'123456' -B -A -F --set-gtid-purged=OFF  --master-data=2 --single-transaction  --events |gzip >/root/205_$(date +%F).sql.gz
 
以上备份的sql文件,恢复时,直接执行"mysql -uroot -p123456 < file.sql" 或者登录数据库执行"source file.sql" 命令进行即可恢复备份的数据!不需要提前创建要恢复的库!

                                                                   mysql数据库相关备份策略的脚本分享                                                      

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
本机mysql采用的是多库多实例方案,即一个库对应一个实例,有多少个库就开启多少个端口的mysql实例。
正常情况下都采用这种方案,一库一实例集群,隔离性和可辨识性会很强,性能也更强。
 
如果是虚拟机,机器性能有限,可以一个实例开启多个库。比如一个实例对应3个库,开启三个实例,一台机器总共开9个库,
然后针对这三个实例再做集群(比如一主两从,即再加两台机器,分别针对每台机器的三个实例做各自的一主两从)
 
mysql的备份脚本:
[app@kevin-mysql01 scripts]$ pwd
/home/scripts
[app@kevin-mysql01 scripts]$ ls
dump_full.sh  full_backup_mysql.sh  incremental_backup_mysql.sh  shibo_databackup.sh  rsync.sh
  
1)
[app@kevin-mysql01 scripts]$ cat dump_full.sh
#!/bin/bash
#注释:mysql DB的全库备份脚本
DB_USER='mybak'
DATE=`date -d"today" +%Y%m%d`
TIME=`date "+%Y-%m-%d %H:%M:%S"`
echo '--------------开始分库分表备份:开始时间为 '$TIME
for port in `ps -ef | grep mysql| grep socket| grep datadir| awk -F= '{print $NF}'`
  do
    BEGIN=`date "+%Y-%m-%d %H:%M:%S"`
    BEGIN_T=`date -d "$BEGIN" +%s`
    echo '备份'$port'端口号的mysql实例,开始时间为 '$BEGIN
    BACKUP_DIR=/data/backup/$DATE/$port;
    mkdir -p  $BACKUP_DIR;
    ##避免循环的port和sock不匹配
    sock=`ps -ef | grep mysql| grep socket| grep datadir|awk -F".pid" '{print $NF}'grep $port`
    DB_PASSWORD='MySQL123.'  
    #过滤掉MySQL自带的DB
    for in `/usr/local/mysql/bin/mysql -u$DB_USER -p$DB_PASSWORD  $sock -BN -e"show databases;" |sed '/^performance_schema$/'d|sed '/^mysql/'d |sed '/^information_schema$/'d|sed '/^information_schema$/'d|sed '/^test$/'d  `
    do
      sudo  /usr/local/mysql/bin/mysqldump -u$DB_USER -p$DB_PASSWORD $sock --master-data=2 -q  -c  --skip-add-locks  -R -E -B $i > $BACKUP_DIR/$date$i.sql
    done
    END=`date "+%Y-%m-%d %H:%M:%S"`
    END_T=`date -d "$END" +%s`
    TIME_INVENTAL_M=$[($END_T-$BEGIN_T)/60]
    TIME_INVENTAL_S=$[($END_T-$BEGIN_T)%60]
    echo '备份'$port'端口号的mysql实例于' $END '备份完成,使用时间为 '$TIME_INVENTAL_M'分钟'$TIME_INVENTAL_S'秒'
         #备份文件的处理
         cd $BACKUP_DIR/..
         tar -zczf $port'_'$(date +%F_%H-%M).tar.gz $port
         #解压 tar -zvxf  $port.tar.gz
         rm -rf $port
done
TIME_END=`date "+%Y-%m-%d %H:%M:%S"`
echo '--------------backup all database successfully!!!结束时间:' $TIME_END
#删除60天以前的备份
find /data/backup/ -name '*'`date +%Y`'*' -type d -mtime  +60 -exec rm -rf  {} ;
  
2)
[app@kevin-mysql01 scripts]$ cat full_backup_mysql.sh
#!/bin/sh
#########################################################################
## Description: Mysql全量备份脚本
## File Name: full-backup-mysql.sh
## Author: wangshibo
## mail: wangshibo@************
## Created Time: 2017年9月11日 14:17:09
##########################################################################
OneMonthAgo=`date -d "2 month ago"  +%Y%m%d`
today=`date +%Y%m%d`
datetime=`date +%Y%m%d-%H-%M-%S`
config=/etc/mykedata_3326.cnf
basePath=/data/backup
logfilePath=$basePath/logs
logfile=$logfilePath/full_$datetime.log
USER=mybak
PASSWD=1az2wsx3edc@sb
SOCKET=/data/mysqldata/kedata/mysql.sock
dataBases="huoqiu batchdb shenzheng tianjin asset bc_asset shanghai vered_dataplatform aomen"
echo 'Full backup mysql in ' $path > $logfile
path=$basePath/full_$datetime
mkdir -p $path
sudo /usr/bin/innobackupex  --defaults-file=$config  --user=$USER --password=$PASSWD --socket=$SOCKET --compress --compress-threads=2 --compress-chunk-size=64K --host=localhost  $path --no-timestamp  > $logfile 2>&1
#--safe-slave-backup
sudo chown app.app $path -R
ret=`tail -n 2 $logfile |grep "completed OK"|wc -l`
if "$ret" =  1 ] ; then
        echo 'delete expired backup ' $basePath/$OneMonthAgo  >> $logfile
        echo $path > $logfilePath/last_backup_sucess.log
        rm -rf $basePath/full_$OneMonthAgo*
        rm -f   $logfilePath/full_$OneMonthAgo*.log
else
  echo 'backup failure ,no delete expired backup'  >> $logfile
fi
  
if "$ret" = 1 ] ;then
    status=0
else
    status=1
fi
echo $status
ts=`date +%s`;
curl -X POST -d "[{"metric": "backup_status", "endpoint": "bl2-mysql01.veredholdings.cn", "timestamp": $ts,"step":86400,"value": $status,"counterType": "GAUGE","tags": ""}]" http://127.0.0.1:1988/v1/push
  
3)
[app@kevin-mysql01 scripts]$ cat incremental_backup_mysql.sh
#!/bin/sh
#########################################################################
## Description: Mysql增量备份脚本
## File Name: incremental-backup-mysql.sh
## Author: wangshibo
## mail: wangshibo@************
## Created Time: 2018年1月11日 14:17:09
##########################################################################
today=`date +%Y%m%d`
datetime=`date +%Y%m%d-%H-%M-%S`
config=/etc/mykedata_3326.cnf
basePath=/data/backup
logfilePath=$basePath/logs
logfile=$logfilePath/incr_$datetime.log
USER=mybak
PASSWD=1az2wsx3edc@sb
dataBases="huoqiu batchdb shenzheng tianjin shanghai asset aomen"
  
pid=`ps -ef | grep -v "grep" |grep -i innobackupex|awk '{print $2}'|head -n 1`
if [ -z $pid ]
then
  echo " start incremental backup database " >> $logfile
  OneMonthAgo=`date -d "1 month ago"  +%Y%m%d`
  path=$basePath/incr_$datetime
  mkdir -p $path
  last_backup=`cat $logfilePath/last_backup_sucess.log| head -1`
  echo " last backup is ===> " $last_backup >> $logfile
sudo /usr/bin/innobackupex  --defaults-file=$config  --user=$USER --password=$PASSWD --compress --compress-threads=2 --compress-chunk-size=64K --slave-info  --host=localhost --incremental $path --incremental-basedir=$last_backup --databases="${dataBases}" --no-timestamp >> $logfile 2>&1
#--safe-slave-backup
sudo chown app.app $path -R
  ret=`tail -n 2 $logfile |grep "completed OK"|wc -l`
  if "$ret" =  1 ] ; then
    echo 'delete expired backup ' $basePath/incr_$OneMonthAgo*  >> $logfile
    rm -rf $basePath/incr_$OneMonthAgo*
    rm -f $logfilePath/incr_$OneMonthAgo*.log
    echo $path > $logfilePath/last_backup_sucess.log
  else
    echo 'backup failure ,no delete expired backup'  >> $logfile
  fi
else
   echo "****** innobackupex in backup database  ****** "  >> $logfile
fi
  
4)
[app@kevin-mysql01 scripts]$ cat shibo_databackup.sh
#!/bin/bash
USERNAME=root
PASSWORD=kevin@qwe123!@#s
DATE=`date +%Y-%m-%d`
OLDDATE=`date +%Y-%m-%d -d '-30 days'`
  
MYSQL=/usr/local/mysql/bin/mysql
MYSQLDUMP=/usr/local/mysql/bin/mysqldump
MYSQLADMIN=/usr/local/mysql/bin/mysqladmin
SOCKET=/data/mysqldata/kedata/mysql.sock
BACKDIR=/data/backup/
  
[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}
[ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE}
[ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE}
  
for DBNAME in anhui huoqiu beijing  shenzheng shanghai tianjin  wangshibo aomen
do
   ${MYSQLDUMP} --opt -u${USERNAME} -p${PASSWORD} -S${SOCKET} ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz
   logger "${DBNAME} has been backup successful - $DATE"
   /bin/sleep 5
done
  
5)
[app@kevin-mysql01 scripts]$ cat rsync.sh
#!/bin/bash
datetime=`date +%Y%m%d-%H-%M-%S`
logfile=/data/backup/rsync.log
echo "$datetime Rsync backup mysql start "  >> $logfile
sudo rsync -e "ssh -p6666" -avpgolr /data/backup kevin@192.168.10.30:/data/backup_data/kevin/DB_bak/192.168.10.163/ >> $logfile 2>&1
  
ret=`tail -n 1 $logfile |grep "total size"|wc -l`
if "$ret" =  1 ] ; then
        echo "$datetime Rsync backup mysql finish " >> $logfile
else
        echo "$datetime Rsync backup failure ,pls sendmail"  >> $logfile
fi
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
原文地址:https://www.cnblogs.com/yaoyangding/p/15049256.html