mysql备份及还原数据库

mysql备份的类型

  1. 按影响划分:
  • 热备份: 读写不受影响
  • 温备份: 仅可以执行读操作
  • 冷备份: 离线备份, 读写操作均中止
  1. 按备份的方式:
  • 物理备份:直接复制mysql的数据文件
  • 逻辑备份:将数据导出可以执行的sql文件
  1. 按备份的量多少划分
  • 完全备份: 备份全部数据库
  • 增量备份: 仅备份上次完全备份或者上次增量备份之后发生变化的数据 (一般最常用)
  • 差异备份: 仅备份上次完全备份以后变化的数据

增量备份和差异备份的理解:

  • 增量备份:如果已经完全备份过,并且没有进行第一次增量备份,则会依据完全备份进行第一次增量备份,如果已经有了第一次增量备份,则会在完全备份和第一次增量备份的前提下,进行第二次增量备份
  • 差异备份:差异备份只依据完全备份,即就算完全备份之后已经进行过一次差异备份,第二次差异备份不会参考第一次差异备份,还是以完全备份为参照


    增量备份和差异备份的区别

逻辑备份的优缺点

  • 优点:
    • 对于MyIASM 引擎和 InnoDB 引擎各自的速度有差异
    • 逻辑备份的结果,我们可以使用文本处理工具来处理
    • 逻辑备份有很强的兼容性,而物理备份对版本要求比较高
  • 缺点:
  • 逻辑备份会被数据库产生压力,物理备份不会
  • 逻辑备份会丢失浮点数的精度
  • 逻辑备份生成的文件比源文件内容更大

mysql备份的内容

  • 数据文件
  • 日志文件(事务文件,二进制文件)
  • 存储过程
  • 配置文件
  • 数据库备份脚本,以及数据库自身清理的linux定时任务Croutab

mysql的备份工具

  • mysql自带的工具:
    • mysqldump 逻辑备份工具,支持所有的引擎,对于MyIASM引擎是温备份(影响写操作),对InnoDB是热备份(不影响读写操作)
    • mysqlhotcopy 物理备份工具,冷备份,只支持MyIASM引擎
  • 文件系统备份工具:
    • cp命令:冷备份物理备份
  • 其他工具:
  • xtrabackup 开源工具,对于MyIASM是温备份,对于InnoDB是热备份

mysql备份的策略

  • 1.直接拷贝数据库文件:
    使用这种方式,必须保证表不在被使用.让服务器停止运行,或者停止读写操作.直接把数据文件从一台机器拷贝到另外一台机器必须保证的是两台机器拥有相同的数据库版本,相同的数据库引擎,相同的配置.同时要求拷贝到另一台机器的时候,另一台机器也不使用这这个表
mysql>>FLUSH TABLES WITH READ LOCK;  #加锁 ,并且不能退出交互模式,新开一个终端执行下面的命令

打开新终端
创建存放备份数据的目录
mkdir -p /data/backup    # -p 递归创建目录
拷贝文件到存放数据的目录
cp -ar /var/lib/mysql/  /data/backup    # -a 保留属性的复制,-r递归复制文件夹下面的所有文件

回到上面的锁表终端释放锁
mysql>>unlock tables;

如果数据发生丢失,就将上面的数据文件还原到数据库数据目录
cp -ar /data/backup /var/lib/mysql

重新启动mysql
service mysqld restart 

对于cp备份之后数据库新添的数据利用增量备份恢复
  • 2.使用mysqldump方法,完全备份加增量备份
    mysqldump将数据表导成sql脚本文件,对于不同版本mysql之间的备份是比较方便的.因为sql语句一般不会变化.对于业务量不大的数据库,可以一周进行一次完全备份,每周的每一天都进行增量备份,如此循环往复.对于业务量非常频繁,数据比较重要的数据库,可以增加上面的备份间隔.
备份数据表语句:
mysqldump -uusername -ppassword db_name table_name1[,table_name2,table_name3...] > back.sql
back.sql文件中有创建表语句,不需要手动创建表,如果恢复sql文件的时候表已经创建好了,需要编辑back.sql文件删除创建表语句

备份数据库语句:
mysqldump -uusername -ppassword --database db_name > back.sql
恢复的时候不需要手动创建数据库,如果数据库已经创建好,编辑文件删除创建数据库语句
mysqldump -uusername -ppassword --all-database > back.sql

还原数据库文件语句:
方式一:
不需要数据库的还原(还原数据库)
mysqldump -u -p -N < back.sql
需要数据库的还原(还原数据表)
mysqldump -u -p db_name -N < back.sql

方式二:
进入mysql交互模式:
mysql -u -p 
还原数据库
mysql>>source back.sql
还原数据表,需要先选择数据库
mysql>>use db_name
mysql>>source back.sql

示例:使用mysqldump配合增量文件恢复
增量文件需要

现在拥有的数据库
mysql>>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| mysql              |
| test               |
+--------------------+
查看mysql的二进制日志文件
mysql -u -p -N -e "SHOW MASTER STATUS"
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      106 |              |                  |
+------------------+----------+--------------+------------------+

备份所有数据库
退出mysql 交互模式 终端输入:
mysqldump --all-databases --lock-all-tables  > backup.sql

创建一个新的数据库,这个操作并没有被备份进backup.sql,而是属于增量数据,会被记录于二进制日志文件,Position位置改变了
mysql -u -p -N -e "SHOW MASTER STATUS"
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      191 |              |                  |
+------------------+----------+--------------+------------------+
备份二进制日志文件
cp /var/lib/mysql/mysql-bin.000003 ./
停止mysql服务
service mysqld stop
手动删除数据,造成数据丢失
rm -rf /var/lib/mysql/*
启动mysql
service mysqld start

查看数据库
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
先关闭二进制日志
mysql> SET sql_log_bin=OFF; 
恢复数据
mysql> source backup.sql
开启二进制日志:
mysql> SET sql_log_bin=ON;
查看数据库
mysql> SHOW DATABASES;   #数据库恢复, 但是缺少TEST1
+--------------------+
| Database           |
+--------------------+
| information_schema |
| employees          |
| mysql              |
| test               |
+--------------------+

通过增量日志恢复TEST1
mysql -u -p - N < mysqlbinlog --start-position=106 --stop-position=191 mysql-bin.000003 
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TEST1              |
| employees          |
| mysql              |
| test               |
+--------------------+

关于使用快照lvm2和xtrabackup恢复请点击参考链接
关于增量文件如何生成并使用请点击参考链接

你可能感兴趣的:(mysql备份及还原数据库)