**
**
一、直接针对数据目录备份
cd /usr/local/mysql/data/ #进入目录内
tar Jcf mysql_all-$(date +%F).tar.xz #针对data进行打包
tar xf xxx -C xxx #把打包的解压至数据文件就还原了
二、使用专用备份工具mysqldump
MySQL自带的备份工具,相当方便对MySQL进行备份。通过该命令工具可以将制定的库、表或全部的库导出为SQL脚本,在需要恢复时可进行数据恢复
使用专用备份工具mysqldump
(1)对单个库进行完全备份
格式:mysqldump -u用户名 -p[密码] [选项] [数据库名] > /备份路径/备份文件名
mysqldump -uroot -p123123 auth > /backup/auth-$(date +%Y%m%d).sql
(2)对多个库进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] --databases 库名1 [库名2]… > /备份路径/备份文件名
[root@mysql ~]# mysqldump -uroot -p123123 --databases mysql auth > /backup/mysql+auth-$(date +%Y%m%d).sql
(3)对所有库进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
mysqldump -uroot -p123123 --opt --all-databases >/backup/mysql_all.$(date +%Y%m%d).sql //–opt 加快备份速度,当备份数据量大时使用
(4)对表进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
mysqldump -uroot -p123123 auth user >/backup/auth_user-$(date +%Y%m%d).sql
(5)对表结构的备份
格式:mysqldump -u用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名
mysqldump -uroot -p123123 -d mysql user >/backup/desc_mysql_user-$(date +%Y%m%d).sql
三、恢复数据库
如果导入的是表节构 站在库里面直接source 表节构的位置
如果导入的是库节构 需要先创建同名字的库 然后在库里面 导入库节构,所有节构就都ok
导入数据 先导入节构在导入库 安全
1、source命令
登录到MySQL数据库
执行source 备份sql脚本路径
source /backup/mysql_all.20160505.sql
2、mysql命令
格式:mysql -u用户名 -p [密码] < 库备份脚本的路径
mysql -u用户名 -p [密码] 库名 < 表备份脚本的路径
四、MySQL备份思路
1、定期实施备份,指定备份计划或策略,并严格遵守
2、除了进行完全备份,开启MySQL服务器的日志功能是很重要的(完全备份加上日志,可以对MySQL进行最大化还原)
3、使用统一和易理解的备份名称,推荐使用库名或者表名加上时间的命名规则,如mysql_user-20160505.sql,不要使用backup1之类没有意义的名字。
二进制日志(记录了对库或者表修改的操作,用来做主从复制)
在/etc/my.cnf中添加 开启功能并且控制每个文件的大小
log-bin=mysql-bin
max_binlog_size=524288
五、增量备份
1.MySQL二进制日志对备份的意义:
二进制日志保存了所有更新或者可能更新数据库的操作。
二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush
logs命令后重新创建新的日志文件。
[root@mysql ~]# vim /etc/my.cnf
52 max_binlog_size = 1024000 //二进制日志最大1M
只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。要进行MySQL的增量备份,首先要开启二进制日志功能,开启MySQL的二进制日志功能。
方法一:MySQL的配置文件的[mysqld]项中加入log-bin=文件存放路径/文件前缀,如log-bin=mysql-bin,然后重启mysqld服务。默认此配置存在。
awk /log-bin/’{print NR,$0}’ /etc/my.cnf
51 log-bin=mysql-bin
114 #log-bin=mysql-bin
方法二:使用mysqld --log-bin=文件存放路径/文件前缀 重新启动mysqld服务
每周选择服务器负载较轻的时间段,或者用户访问较少的时间段进行备份。
2.生成新的二进制文件
格式:mysqladmin -u用户 -p密码 flush-logs
mysqladmin -uroot -p123123 flush-logs
3…增量的恢复方法
增量恢复的方法
(1)一般的恢复:备份的二进制日志内容全部恢复
格式:mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u用户名 -p密码
(2)基于时间点的恢复:便于跳过某个发生错误的时间点实现数据恢复
格式:
从日志开头截止到某个时间点的恢复:
mysqlbinlog [–no-defaults] --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到日志结尾的恢复:
mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到某个时间点的恢复:
mysqlbinlog [–no-defaults] --start-datetime=’年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u用户名 -p密码
(3)基于位置的恢复:可能在同一时间点既有错误的操作也有正确的操作,基于位置进行恢复更加精准
格式:
mysqlbinlog --stop-position=’操作id’ 二进制日志 |mysql -u用户名 -p密码
mysqlbinlog --start-position=’操作id’ 二进制日志 |mysql -u用户名 -p密码
查看二进制日志文件姿势
mysqlbinlog --no-defaults 二进制文件路径
mysqlbinlog --no-defaults mysql-bin.000001
全量备份只能回复至备份的时候,如果全量备份之间间隔比较长,我们可以用增量备份
增量备份可以帮助我们恢复一定的数据
1、确定当前mysql 是处于哪种表类型下工作的,它们支持事物处理还是非事物的,因为我们需要根据不同的特点来做一些设置。
2、要选择备份的形式是完全备份还是增量备份,它们各有优缺点。
3、为了保证恢复的完整性,我们得开启binary log功能,同时binlog给恢复工作也带来了很大的灵活性,可以基于时间点或是位置进行恢复。考虑到数据库性能,我们可以将binlog文件保存到其他安全的硬盘中。
4、正如最初所提到的,备份操作和应用服务得到同时运行,这样就十分消耗系统资源了,会导致数据库服务性能下降,这就要求我们选择一个合适的时间(比如在应用负担很小的时候)再来进行备份操作。
5、不是备份完就万事大吉,我们还得确认备份是否可用,所以之后的恢复测试是完全有必要的。
附录(我自己写的备份脚本,如果不好别介意哈参考即可)
#!/bin/bash
#定期备份数据库的库节构以及库数据
#name:
#数据库相关变量
MY_DB1="mysql"
MySQL_NAME="root"
MySQL_PASSWD="123456"
MySQL_HOST="localhost"
MySQL_DL="-u $MySQL_NAME -p$MySQL_PASSWD -h $MySQL_HOST"
#定义文件夹相关变量
RQ=$(date +%F)
YF=$(date +%F | awk -F"-" '{print $2}')
DAY=$(date +%F |awk -F- '{print $3}')
#创建文件夹
[ -d /backup/$MY_DB1/${YF}Mouth/${DAY}day ] || mkdir -p /backup/$MY_DB1/${YF}Mouth/${DAY}day &> /dev/null
#设置备份的文件夹路径变量以及后缀时间变量
BACKUP_LJ=/backup/$MY_DB1/${YF}Mouth/${DAY}day
BACKUP_RQ=$(date +%Y-%m-%d-%H-%M)
#设置需要的备份数据库的库名 如果要备份x个表请自行添加
NAME_1="${MY_DB1}-${BACKUP_RQ}"
#开始备份
BF_ML="/usr/local/mysql/bin/mysqldump"
cd ${BACKUP_LJ}/
#备份库节构(节构用_jg表示)
$BF_ML $MySQL_DL -d $MY_DB1 > ${NAME_1}_jg.sql 2>/dev/null
tar zcvf ${NAME_1}_jg.sql.tar ${NAME_1}_jg.sql --remove &> /dev/null
#备份库数据
$BF_ML $MySQL_DL $MY_DB1 > ${NAME_1}.sql 2> /dev/null
tar zcvf ${NAME_1}.sql.tar ${NAME_1}.sql --remove &> /dev/null
增量备份的脚本如下:
#!/bin/bash
#增量备份脚本
#name:
#登陆环境
MySQL_NAME="root"
MySQL_PASSWD="123456"
MySQL_HOST="localhost"
MySQL_DL="-u $MySQL_NAME -p$MySQL_PASSWD -h $MySQL_HOST"
#首先创建目录
RQ=$(date +%F)
YF=$(date +%F | awk -F"-" '{print $2}')
DAY=$(date +%F |awk -F- '{print $3}')
[ -d /backup/ZB/${YF}Mouth/${DAY}day ] || mkdir -p /backup/ZB/${YF}Mouth/${DAY}day
#刷新二进制日志
ML=/usr/local/bin/mysqladmin
$ML $MySQL_DL flush-logs &> /dev/null
#复制二进制文件进入指定目录
LOG_LJ=/usr/local/mysql/data/
QZ="mysql-bin"
BACKUP_LJ=/backup/ZB/${YF}Mouth/${DAY}day/
/bin/cp -p $(ls $LOG_LJ/${QZ}.* |awk -v RS="" '{print $(NF-2)}') $BACKUP_LJ