MySQL-备份

#一 MySQL 逻辑备份 mysqldump
######逻辑备份特点

  • 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
  • 效率相对较低

###1. mysqldump备份
#####备份库

-备份单个库
语法:
    mysqldump -u用户 -p'密码' 库名 > 备份的路径/备份文件名
例如:
    [root@localhost ~]# mkdir /home/back            创建备份文件存储目录 /home/back
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 >/home/back/db1.bk

-备份多个库
语法:
    mysqldump -u用户 -p'密码' -B 数据库1 数据库2 数据库3 > 备份文件的路径/备份文件名
例如:
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' -B db1 db2 db3 >/home/back/db1.bk

-备份所有库
语法:
    mysqldump -u用户 -p'密码' -A > 备份文件的路径/备份文件名
例如:
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' -A >/home/back/alldb.bk

#####备份表

-备份单个表
语法:
    mysqldump -u用户 -p'密码' 库名 表名 > 备份的路径/备份文件名
例如:
    [root@localhost ~]# mkdir /home/back            创建备份文件存储目录 /home/back
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 t1 >/home/back/db1.t1.bk

-备份多个表
语法:
    mysqldump -u用户 -p'密码' 库名 表名1 表名2 > 备份的路径/备份文件名
例如:
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 t1 t2 >/home/back/db1.t1-t2.bk

###2. mysqldump恢复

为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志,因为binlog使用binlog日志恢复数据时也会产生binlog日志。
-停止binlog日志
    mysql> set sql_log_bin=0;
-方式一:
    mysql> source 备份的路径/备份文件名
-方式二:
    [root@localhost ~]# mysql -u用户 -p'密码' 库名 表名 < 备份的路径/备份文件名

#####恢复库

语法:
    mysql -u用户 -p'密码' 库名 < 备份的路径/备份文件名
-创建一个要数据恢复到的库
    mysql> create database db1;
例如:
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 </home/back/db1.bk

#####恢复表

语法:
    mysql -u用户 -p'密码' 恢复到的库名 < 备份的路径/备份文件名
例如:
    [root@localhost ~]# mysqldump -uroot -p'Cc@123' db1 < /home/back/db1.t1.bk

###3. 通过binlog恢复
#####首先应开启binlog日志

-开启binlog日志
    vim /etc/my.cnf
在[mysqld]添加
    log-bin=/var/log/mysql/mysql-bin        # binlog日志存放位置/var/log/mysql      所有日志文件以/mysql-bin开头
    server-id=1                           # 用于主从复制      id号必须写

-创建binlog日志存放文件夹
    [root@localhost ~]# mkdir /var/log/mysql

-给mysql用户权限
    [root@localhost ~]# chown mysql.mysql /var/log/mysql

-重启mysql服务
    [root@localhost ~]# systemctl restart mysql

#####使用binlog恢复

-分析binlog日志文件
语法:
    mysqlbinlog 文件路径/文件名
例如:
    mysqlbinlog /var/log/mysql/mysql-bin.000002
-使用binlog恢复
语法:
    mysqlbinlog --start-position 恢复开始位置 --stop-position 恢复停止位置 文件路径/文件名 |mysql -u用户 -p'密码'
例如:
    mysqlbinlog --start-position 219 --stop-position 321 /var/log/mysql/mysql-bin.000002 |mysql -uroot -p'Cc@123'

#二 percona-xtrabackup 物理备份
#####物理备份特点

  • 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,
  • 但不能恢复到不同的MySQL版本。

首先必须安装xtrabackup

###1. 完全备份
每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。

####1.1 完全备份流程

-创建备份目录
    [root@localhost ~]# mkdir /xtrabackup/full -p
-备份全部数据
语法:
    innobackupex --user=用户 --password='密码' 备份文件的存储路径
例如:
    [root@localhost ~]# innobackupex --user=root --password='Cc@123' /xtrabackup/full

####1.2 完全备份恢复流程

1. 停止数据库
    [root@localhost ~]# systemctl stop mysqld

2. 清理环境
    [root@localhost ~]# rm -rf /var/lib/mysql/*

3. 重演回滚
    [root@localhost ~]# innobackupex --apply-log /xtrabackup/full/完整备份

4. 恢复数据
恢复之前需要先确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里
    [root@localhost ~]# cat /etc/my.cnf
确保有下列内容
    [mysqld]
    datadir=/var/lib/mysql
-恢复
    [root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份

5. 修改权限
    [root@localhost ~]# chown -R mysql.mysql /var/lib/mysql

6. 启动数据库
    [root@localhost ~]# systemctl start mysqld

事件回滚:就是把备份数据的时间段内产生的数据操作,转换为MySQL真正的数据文件

###2. 增量备份
每次备份上一次备份到现在产生的新数据
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长

####2.1 增量备份流程
首先需要对数据库进行一次完整备份,之后的每次增量备份都是参照上次的备份为依据,假如第一次的增量备份,参考的是第一次完整备份,那么第二次的增量备份,参考的是第一次的增量备份,第三次的增量备份,参考的是第二次的增量备份,依次类推…
这里的每次备份都是有相互的依赖关系的,恢复数据的时候,一个都不能少

创建增量备份首先得拥有一个完整备份

-增量备份:每次备份都以上一次备份为目录即为增量备份
语法:
    innobackupex --user=用户 --password='密码' --incremental 增量备份存储位置 --incremental-basedir=完整备份文件路径
例如:
    [root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/完整备份
此时/xtrabackup/full里有完整备份,增量备份1
    [root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/增量备份1
此时/xtrabackup/full里有完整备份,增量备份1,增量备份2

####2.2 增量备份恢复流程
首先对完整备份进行回滚操作,此时转换的数据是转换到完整备份的目录中,再依次对剩余的增量备份进行回滚操作,顺序第一次增量备份,第二次增量备份,第三次增量备份…

1. 停止数据库
    [root@localhost ~]# systemctl stop mysqld

2. 清理环境
    [root@localhost ~]# rm -rf /var/lib/mysql/*

3. 依次重演回滚
    [root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份
    [root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/增量备份1
    [root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/增量备份2

4. 恢复数据
    [root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份

5. 修改权限
    [root@localhost ~]# chown -R mysql.mysql /var/lib/mysql

6. 启动数据库
    [root@localhost ~]# systemctl start mysqld

###3. 差异备份
只备份跟完整备份不一样的,在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。

####3.1 差异备份流程
首先需要对数据库进行一次完整备份,之后的每次差异备份都是参照第一次完整备份为依据的,假如第一次的差异备份,参考的是完整备份,第二次的差异备份,参考的还是完整备份,依次类推…
这里的每次的差异备份都是独立的,但是都依赖于第一次完整备份

创建差异备份首先得拥有一个完整备份

-差异备份:每次备份都以完整备份为目录即为差异备份
语法:
    innobackupex --user=用户 --password='密码' --incremental 差异备份存储位置 --incremental-basedir=完整备份文件路径
例如:
    [root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/完整备份
此时/xtrabackup/full里有完整备份,差异备份1
    [root@localhost ~]# innobackupex --user=root --password='Cc@123' --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/差异备份1
此时/xtrabackup/full里有完整备份,差异备份1,差异备份2

####3.2 差异备份恢复流程
首先对第一次完整备份进行回滚操作,此时转换的数据是转换到完整备份的目录中,之后可以根据实际需要选择对应时间点的差异备份,进行事件的回滚,转换的数据放到完整备份的目录中

1. 停止数据库
    [root@localhost ~]# systemctl stop mysqld

2. 清理环境
    [root@localhost ~]# rm -rf /var/lib/mysql/*

3. 重演回滚
    [root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份
    [root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/full/完整备份 --incremental-dir=/xtrabackup/full/差异备份2

4. 恢复数据
    [root@localhost ~]# innobackupex --copy-back /xtrabackup/full/完整备份

5. 修改权限
    [root@localhost ~]# chown -R mysql.mysql /var/lib/mysql

6. 启动数据库
    [root@localhost ~]# systemctl start mysqld

简单的讲,完整备份就是不管三七二十一,每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化;增量备份就是每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;差异备份就是每次都将第一次完整备份以来有变化的文件进行备份。

发布了92 篇原创文章 · 获赞 0 · 访问量 1440

猜你喜欢

转载自blog.csdn.net/Forgetfanhua/article/details/105249222