Skip to content

Latest commit

 

History

History
268 lines (209 loc) · 10.5 KB

5.49-数据备份.md

File metadata and controls

268 lines (209 loc) · 10.5 KB

数据备份重要性:

数据尤其是一个公司的核心数据关系着公司的命脉,数据丢失可以导致公司倒闭。

数据主要分为两大类:

文件类:  
	程序代码、图片、附件、软件包、配置文件

数据(数据库)类:
	关系型数据库(MySQL/MariaDB等)、非关系型数据库(Redis、MongoDB等)

备份原则:

每日一备份,本地保存一份,远程保存一份,根据数据重要性和磁盘空间决定保存周期。

文件类的备份:

tar、scp、cp、rsync

数据类:

自带工具实现备份(如,mysqldump、Xtrabackup)

rsync教程

rsync -av /etc/passwd /tmp/1.txt
rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt 

rsync格式

rsync [OPTION] … SRC   DEST
rsync [OPTION] … SRC   [user@]host:DEST
rsync [OPTION] … [user@]host:SRC   DEST
rsync [OPTION] … SRC   [user@]host::DEST
rsync [OPTION] … [user@]host::SRC   DEST

rsync常用选项

-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,让我们知道同步的过程
-l 保留软连接
-L 加上该选项后,同步软链接时会把源文件给同步
-p 保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
--delete 删除DEST中SRC没有的文件
--exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步
-P 显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,如果DEST中的文件比SRC新,则不同步
-z 传输时压缩

rsync通过ssh方式同步

rsync -av test1/ 192.168.133.132:/tmp/test2/
rsync -av -e "ssh -p 22" test1/ 192.168.133.132:/tmp/test2/

rsync 通过服务的方式同步

要编辑配置文件/etc/rsyncd.conf
启动服务rsync --daemon
格式:rsync -av test1/ 192.168.133.130::module/dir/

rsyncd.conf样例

port=873
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
address=192.168.133.130
[test]
path=/root/rsync
use chroot=true
max connections=4
read only=no
list=true
uid=root
gid=root
auth users=test
secrets file=/etc/rsyncd.passwd
hosts allow=192.168.133.132 1.1.1.1 2.2.2.2  192.168.133.0/24

rsyncd.conf配置文件详解 

port:指定在哪个端口启动rsyncd服务,默认是873端口。
log file:指定日志文件。
pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等进程管理操作。
address:指定启动rsyncd服务的IP。假如你的机器有多个IP,就可以指定由其中一个启动rsyncd服务,
	如果不指定该参数,默认是在全部IP上启动。
[]:指定模块名,里面内容自定义。
path:指定数据存放的路径。
use chroot true|false:表示在传输文件前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,
	但缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,
	如果你的数据当中有软连接文件,阿铭建议你设置成false。
max connections:指定最大的连接数,默认是0,即没有限制。
read only ture|false:如果为true,则不能上传到该模块指定的路径下。
list:表示当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏。
uid/gid:指定传输文件时以哪个用户/组的身份传输。
auth users:指定传输时要使用的用户名。
secrets file:指定密码文件,该参数连同上面的参数如果不指定,则不使用密码验证。
	注意该密码文件的权限一定要是600。
	格式:用户名:密码
hosts allow:表示被允许连接该模块的主机,可以是IP或者网段,如果是多个,中间用空格隔开。 
当设置了auth users和secrets file后,客户端连服务端也需要用用户名密码了,
若想在命令行中带上密码,可以设定一个密码文件

rsync -avL [email protected]::test/test1/  /tmp/test8/ --password-file=/etc/pass 
其中/etc/pass内容就是一个密码,权限要改为600

mysqldump教程

备份数据库的命令为:
mysqldump -ubackup -pxxxxx db1 > db1.sql

如果是远程的MySQL服务,还可以加上IP和Port,例如:
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308 db1 > db1.sql

mysqldump工具常用的几个用法,如下:

1)只备份表结构,不备份数据
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308 -d db1 > db1.sql

2)只备份数据,不备份表结构
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308 -t db1 > db1.sql

3)只备份指定表
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308  db1  tb1 > db1_tb1.sql

4)备份全部数据库
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308 -A > all_db.sql

5)备份指定多个库
mysqldump -ubackup -pxxxxx -h192.168.100.100 -P3308 -B db1 db2 > db12.sql

恢复数据:
mysql -uroot -pxxxxx dbname < xxx.sql

xtrabackup教程

提供一个参考文档:http://xtra.aminglinux.com

mysqldump对于导出几个G的数据库或几个表,还是不错的,速度并不慢。一旦数据量达到几十上百G,
无论是对原库的压力还是导出的性能,mysqldump就力不从心了。Percona-Xtrabackup备份工具,
是实现MySQL在线热备工作的不二选择,可进行全量、增量、单表备份和还原。

xtrabackup命令只支持InnoDB和XtraDB存储引擎的数据库非阻塞地备份,
而innobackupex通过perl封装了一层xtrabackup,对MyISAM的备份通过加表读锁的方式实现。

在CentOS7上这样安装percona-xtrabackup
安装yum源
rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm  
yum install -y percona-xtrabackup-24 //yum安装2.4版本

用xtrabackup做全量备份的命令是:
innobackupex --defaults-file=/etc/my.cnf  --host=10.100.100.100  --port=3333 \
--user=bakuser --password=your_pass  /data/backup/mysql

说明:在执行该备份操作之前,需要先创建一个用户bakuser(用户名自定义),
并授予reload, lock tables, replication client, process, super等权限。
备份数据将会放到/data/backup/mysql目录里面,自动生成一个以当前日期、时间为名字的目录,例如2018-10-15_03_00_01。

增量备份:
innobackupex --host=10.100.100.100  --port=3333 --user=bakuser --password=your_pass \
 --incremental /data/backup/mysql --incremental-basedir=/data/backup/mysql/last-backup-file

说明:
--incremental :表示本次备份是一个增量备份(若针对的上次备份为一个全量备份,这里也可以认为是个差量备份)
--incremental-basedir:指定本次增量备份针对的哪一个备份(可以是上个增量,也可以是上个全量)
增量备份可以一环扣一环,比如可以周一做一个全量备份,然后周二做周一的增量,周三做周二的增量。。。


恢复:
1)全量备份的恢复
预备恢复:innobackupex --apply-log /PATH/TO/BACKUP/dir-quan --user-memroy=2G
停止MySQL/MariaDB,将datadir目录里面的数据清空(或者挪走)
恢复:innobackupex --defaults-file=/etc/my.cnf  --copy-back  /PATH/TO/BACKUP/dir-quan
改权限:chown -R mysql:mysql /PATH/TO/datadir
启动MySQL/MariaDB

说明:
--apply-log:指定全备文件路径
--use-memory=N:指定恢复数据时,使用内存大小,默认为100M,若备份数据量大且有足够的空闲内存时,
    可以用来指定大小的内存来工作,单位可以使用G,M....。
--defaults-file: 指定配置文件路径,通过配置文件它会找到datadir在哪里


2)增量备份的恢复
停止服务
删除dataidir里面的数据
准备全量:
innobackupex --apply-log --redo-only  /PATH/TO/全量备份目录
准备增量1:
innobackupex --apply-log --redo-only  /PATH/TO/全量备份目录 --incremental-dir=/PATH/TO/第一次增量备份目录
准备增量2:
innobackupex --apply-log --redo-only /PATH/TO/全量备份目录  --incremental-dir=/PATH/TO/第二次增量备份目录
......
准备最后一个增量:
innobackupex --apply-log /PATH/TO/全量备份目录  --incremental-dir=/PATH/TO/最后一次增量备份目录
再次准备全量:
innobackupex --apply-log   /PATH/TO/全量备份目录   #(这次不用加--redo-only了)

恢复:
innobackupex --copy-back /PATH/TO/全量备份目录
改权限:chown -R mysql:mysql /PATH/TO/datadir
启动MySQL/MariaDB

说明:--redo-only:表示进行准备(应用日志)工作时,只进行redo操作,只会重做已提交但未应用的事务,
不会回滚未提交的事务。原因是后面还有个增量备份,未提交的可能在后面增量备份时进行提交。
需要注意的是,最后一个增量备份不需要加这个选型。

MariaDB新版本(10.3.x+)的备份和恢复

MariaDB10.3.x及以上的版本用Percona XtraBackup工具会有问题。
原因可能是MariaDB10.3以上版本的redo日志格式和之前不同了。
解决方案是,使用mariabackup,它是MariaDB提供的一个开源工具,用于对InnoDB,Aria和MyISAM表进行物理在线备份。
这个工具是基于Percona的XtraBackup(版本2.3.8)的解决方案:

全量备份:
mariabackup --defaults-file=/etc/my.cnf --backup --user=xxx --password=xxx --target-dir /data/backup/2019-02-21

全量恢复:
停止数据库
清空datadir
mariabackup --prepare --target-dir /data/backup/2019-02-21/ 
mariabackup --copy-back --target-dir /data/backup/2019-02-21/
改属主、属组
启动

增量备份:
mariabackup --defaults-file=/etc/my.cnf --backup --user=xxx --password=xxx --target-dir /data/backup/2019-02-21
第一个增量:mariabackup --backup --user=xxx --password=xxx  --target-dir /data/backup/2019-02-21_inc1 --incremental-basedir /data/backup/2019-02-21
第二个增量:mariabackup --backup --user=xxx --password=xxx  --target-dir /data/backup/2019-02-21_inc2 --incremental-basedir /data/backup/2019-02-21_inc1

增量恢复:
先准备全备
mariabackup --prepare --target-dir /data/backup/2019-02-21 --apply-log-only
准备第一个增量:
cd /data/backup
mariabackup --prepare --target-dir ./2019-02-21 --incremental-dir ./2019-02-21_inc1 --apply-log-only
准备第二个增量:
mariabackup --prepare --target-dir ./2019-02-21 --incremental-dir ./2019-02-21_inc2 --apply-log-only
恢复:
mariabackup --copy-back  --target-dir ./2019-02-21

备份脚本

#!/bin/bash 
bakdir=/data/backup
d=`date +%F`

for db in bbs blog db2
do
    mysqldump -uroot -paminglinux $db > $bakdir/$db\_$d.sql
done

cd $bakdir
gzip *_$d.sql
find ./ -name "*.gz" -mtime +30 |xargs rm