MySQL备份恢复第二篇

MySQL中的数据恢复功能相比Oracle来说还是要单薄一些,而Oracle中的数据恢复相对来说自动化的程度要高一些。不过Mysql的二进制日志提供的信息很丰富,而日志信息在Oracle中式完全屏蔽的,对于数据的恢复可能MySQL也很灵活。
我们来模拟一下通过完整备份+增量备份(binlog)的方式来恢复。
首先我们来选择一个表new_test作为恢复的参考点。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
|    32081 |
+----------+
1 row in set (0.02 sec)

查看一下binlog的情况,这个可以作为后续的恢复使用。
mysql> show binary logs ;
+-----------------------+-----------+
| Log_name              | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 |   3413422 |
| mysql_oel1_bin.000002 |       356 |
+-----------------------+-----------+
2 rows in set (0.00 sec)
mysql> \q
Bye
我们来做一个完全备份。
[mysql@oel1 full_bak]$ mysqldump -u root --lock-all-tables --master-data=2 --flush-logs --all-databases > full.sql
[mysql@oel1 full_bak]$ ll
total 1672
-rw-r--r-- 1 mysql dba 1704276 Apr 14 18:50 full.sql

做完备份,我们尝试做一些数据变更,这样模拟增量备份就更清楚了。
mysql> insert into new_test select *from new_test limit 1,5;
Query OK, 5 rows affected, 1 warning (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 1
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
|    32086 |
+----------+
1 row in set (0.02 sec)
可以看到在全量备份的时候指定刷新日志,日志增长了一个。
mysql> show binary logs;
+-----------------------+-----------+
| Log_name              | File_size |
+-----------------------+-----------+
| mysql_oel1_bin.000001 |   3413422 |
| mysql_oel1_bin.000002 |       408 |
| mysql_oel1_bin.000003 |       356 |
+-----------------------+-----------+
3 rows in set (0.00 sec)
这个时候我们可以备份binlog,为了更加简化,我们可以直接导出二进制日志中的sql
[mysql@oel1 data]$ mysqlbinlog  mysql_oel1_bin.000003 > /u02/mysql/bak/new_bak/new.sql
这个时候我们做了一个大胆的决定,删除所有的数据,直接到data目录下,全部删除,删删删。
[mysql@oel1 data]$ rm -rf *
这个时候直接去停Mysql都会有问题,我们来通过mysqladmin来停。
[mysql@oel1 data]$ mysqladmin -u root shutdown
[mysql@oel1 data]$ 150414 18:54:34 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
这个时候查看mysql进程的情况。
[mysql@oel1 data]$ pstree -p|grep mysql

做完破坏,任务开始了,我们来做恢复,先来尝试一下是否能启动Mysql,毫无疑问启动失败。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin  --log-error=/u02/mysql/log/log_error.log   --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
[mysql@oel1 mysql]$ 150414 18:55:20 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:55:21 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
150414 18:55:22 mysqld_safe mysqld from pid file /u02/mysql/data/oel1.pid ended
[mysql@oel1 mysql]$ pstree -p|grep mysql
但是数据目录下生成了一些文件这是在初始化的时候创建的,但是最后无功而返。我们也不需要,可以直接删除。
[mysql@oel1 mysql]$ cd data
[mysql@oel1 data]$ ll
total 110724
-rw-rw---- 1 mysql dba       56 Apr 14 18:55 auto.cnf
-rw-rw---- 1 mysql dba 12582912 Apr 14 18:55 ibdata1
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile0
-rw-rw---- 1 mysql dba 50331648 Apr 14 18:55 ib_logfile1
-rw-rw---- 1 mysql dba      120 Apr 14 18:55 mysql_oel1_bin.000001
-rw-rw---- 1 mysql dba       24 Apr 14 18:55 mysql_oel1_bin.index
[mysql@oel1 data]$ rm -rf *
这个时候我们来做初始化,就更重新弄创建MySQL一样。
[mysql@oel1 mysql]$ $MYSQL_BASE/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA  --port=1550
然后启动MySQL服务。
[mysql@oel1 mysql]$MYSQL_BASE/bin/mysqld_safe --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_DATA --port=1550 --log-bin=mysql_oel1_bin  --log-error=/u02/mysql/log/log_error.log   --long_query_time=5 --slow-query-log=true --slow-query-log-file=/u02/mysql/log/slow_qeury.log &
启动的过程很快,从日志中看到启动成功。
[mysql@oel1 mysql]$ 150414 18:57:14 mysqld_safe Logging to '/u02/mysql/log/log_error.log'.
150414 18:57:14 mysqld_safe Starting mysqld daemon with databases from /u02/mysql/data
对应的mysql进程也都起来了。
[mysql@oel1 mysql]$ pstree -p|grep mysql
        |-mysqld_safe(20548)---mysqld(20781)-+-{mysqld}(20803)
        |                                    |-{mysqld}(20804)
        |                                    |-{mysqld}(20805)
        |                                    |-{mysqld}(20806)
        |                                    |-{mysqld}(20807)
        |                                    |-{mysqld}(20808)
        |                                    |-{mysqld}(20809)
        |                                    |-{mysqld}(20810)
        |                                    |-{mysqld}(20811)
        |                                    |-{mysqld}(20812)
        |                                    |-{mysqld}(20814)
        |                                    |-{mysqld}(20815)
        |                                    |-{mysqld}(20816)
        |                                    |-{mysqld}(20817)
        |                                    |-{mysqld}(20818)
        |                                    |-{mysqld}(20819)
        |                                    |-{mysqld}(20820)
        |                                    |-{mysqld}(20821)
        |                                    |-{mysqld}(20822)
        |                                    `-{mysqld}(20823)
这个时候来做恢复,先来恢复最初的全量备份。                
[mysql@oel1 full_bak]$ mysql -u root
[mysql@oel1 full_bak]$ 
查看数据的情况,数据是最开始的状态了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
|    32081 |
+----------+
1 row in set (0.03 sec)
然后我们来部署最新的增量备份,就是二进制日志导出的sql文件
[mysql@oel1 new_bak]$ mysql -u root
数据就这样恢复了。
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
|    32086 |
+----------+
1 row in set (0.02 sec)
不过整个过程中,没有考虑实时的数据变化情况,对于binlog的备份就显得更为重要。要不很多最新的变更就会丢失。

时间: 2024-09-24 02:43:51

MySQL备份恢复第二篇的相关文章

MySQL备份恢复第一篇

今天学习了下MySQL的备份恢复内容,也算是对之前的 数据导入导出的一个细化内容.备份恢复的内容其实还是蛮复杂的,一般网站上提到的备份恢复也基本都是逻辑备份恢复的内容.对于更为高效的备份mysqlbackup和恢复的内容提到的很少,mysqlbackup是需要Licence,需要单独收费的,这也算是向oracle产品线的一个靠拢了. 首先我们还是走走老路,来看看最基本的逻辑备份恢复吧.我们模拟了3万多条的数据.然后尝试恢复回来. mysql> use test; Reading table in

mysql备份恢复中的常见错误

从A主机备份到B主机 mysqldump -uroot  -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.22 mysql>source /root/vw.sql; -------------------- Query OK, 6748 rows affected (0.13 sec) Records: 6748 Duplicates: 0 Warnings: 0 Query OK, 6807 rows affect

php实现mysql备份恢复分卷处理的方法_php技巧

本文实例讲述了php实现mysql备份恢复分卷处理的方法.分享给大家供大家参考.具体分析如下: 分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,这里我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入. 分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东

php mysql备份恢复分卷处理(数据库导入导出)

分卷导入类及思路详解 数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西.于是参照了很多,自己写了一个关于分卷导入类.以方便调用.欢迎大家拍砖. 这里针对分卷文件是以'_v1.sql'为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成 //分别是主机,用户名,密码,数据

使用xtrabackup对Mysql备份恢复

备份原理:XtraBackup基于InnoDB的crash-recovery功能.它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致.InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况.XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着trans

MySQL 备份恢复单个innodb表的教程

在实际环境中,时不时需要备份恢复单个或多个表(注意:这里除非明确指定,所说的表一律指InnoDB表),而对于innodb引擎恢复单个表需要整体的恢复,xtrabackup也可以单个表恢复,只不过是用的正则过滤的,不知最新版本是否支持表空间传输特性.本文将要说说怎么移动或复制部分或全部的表到另一台服务器上,而所要用到的技术点就是transportable tablespace特性,这就意味着MySQL5.6.6以及以上版本才支持. 表空间传输特性允许表空间从一个实例移动到另一个实例上.这在以前版本

RDS中的MYSQL备份恢复

RDS使用mysqldump对 MySQL 数据库进行逻辑全量备份,使用开源软件Xtrabackup进行物理全量备份,是实例级别的备份. 用户登录RDS控制台,可以下载备份文件.按照 利用逻辑备份文件恢复到自建数据库-MySQL和利用物理备份文件恢复到自建数据库-MySQL中的操作步骤,实现数据的恢复. 本文主要从原理的角度来介绍MySQL数据库的备份和恢复,希望能让用户更加了解RDS的备份恢复机制.   一.备份类型介绍 1. 按备份操作方式:物理备份和逻辑备份 备份方式 优点 缺点 逻辑备份

在win下mysql备份恢复命令概括

假设mysql 安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name,在d:盘根目录下面存放备份数据库,备份数据库名字为backup20070713.sql(20070713.sql为备份日期) 备份数据库: mysqldump -uroot -p123456 database_name>d:/backup20070713.sql 恢复数据库: 删除原有数据库,建立数据库,把备份数据库导入. mysqladmin -uroot -p12345

Win下mysql备份恢复命令

假设mysql安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name,在d:盘根目录下面存放备份数据库,备份数据库名字为backup20070713.sql(20070713.sql为备份日期) 备份数据库: mysqldump -uroot -p123456 database_name>d:/backup20070713.sql 恢复数据库: 删除原有数据库,建立数据库,把备份数据库导入. mysqladmin -uroot -p123456