MySQL备份与恢复之热备(3)

在上两篇文章(MySQL备份与恢复之冷备,MySQL备份与恢复之真实环境使用冷备)中,我们提到了冷备和真实环境中使用冷备。那从这篇文章开始我们看下热备。显然热备和冷备是两个相对的概念,冷备是把数据库服务,比如MySQL,Oracle停下来,然后使用拷贝、打包或者压缩命令对数据目录进行备份;那么我们很容易想到热备就是在MySQL或者其他数据库服务在运行的情况下进行备份。但是,这里存在一个问题,因为生产库在运行的情况下,有对该库的读写,读写频率有可能高,也可能低,不管频率高低,总会就会造成备份出来的数据和生产库中的数据不一致的情况。热备这段时间,其他人不可以操作是不现实的,因为你总不可能终止用户访问Web程序。要解决这个问题,可以采用指定备份策略,比如哪个时间段进行备份,备份哪些数据等等,总之,保证数据的完整性和一致性,切记,备份重于一切!!!
       热备可以对多个库进行备份,可以对单张表或者某几张表进行备份。但是无法同时备份多个库多个表,只有分开备份。下面我们看下热备的示意图,并进行热备模拟。
示意图

热备模拟

1、对单个库进行备份
第一步,移除LVM快照。(如果没有创建,忽略此步)

[root@serv01 data]# lvremove /dev/data/smydata
Do you really want to remove active logical volume smydata? [y/n]: y
 Logical volume "smydata" successfully removed

第二步,设置MySQL的密码

mysql> set password=password("123456");
Query OK, 0 rows affected (0.00 sec)

第三步,查看MySQL是否启动。因为是热备,所以要求MySQL服务启动

[root@serv01 data]# /etc/init.d/mysqld status
 SUCCESS! MySQL running (2664)

第四步,导出单个数据库

[root@serv01 data]# cd /databackup/

#本质是导出为SQL
[root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb
-- MySQL dump 10.13 Distrib 5.5.29, for Linux (x86_64)
--
-- Host: localhost Database: larrydb
-- ------------------------------------------------------
-- Server version 5.5.29-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `larrydb`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `larrydb` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `larrydb`;

--
-- Table structure for table `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
 `cid` int(11) DEFAULT NULL,
 `cname` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class`
--

LOCK TABLES `class` WRITE;
/*!40000 ALTER TABLE `class` DISABLE KEYS */;
INSERT INTO `class` VALUES (1,'linux'),(2,'oracle');
/*!40000 ALTER TABLE `class` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `stu`
--

DROP TABLE IF EXISTS `stu`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stu` (
 `sid` int(11) DEFAULT NULL,
 `sname` varchar(30) DEFAULT NULL,
 `cid` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stu`
--

LOCK TABLES `stu` WRITE;
/*!40000 ALTER TABLE `stu` DISABLE KEYS */;
INSERT INTO `stu` VALUES (1,'larry01',1),(2,'larry02',2);
/*!40000 ALTER TABLE `stu` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

 Dump completed on 2013-09-10 18:56:06

#将输出结果保存到文件中
[root@serv01 databackup]# mysqldump -uroot -p123456 --database larrydb > larrydb.sql

第五步,模拟数据丢失,进入MySQL,删除数据库

[root@serv01 data]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| crm  |
| game  |
| hello  |
| larrydb  |
| mnt  |
| mysql  |
| performance_schema |
| test  |
+--------------------+
9 rows in set (0.00 sec)

mysql> drop database larrydb;
Query OK, 2 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| crm  |
| game  |
| hello  |
| mnt  |
| mysql  |
| performance_schema |
| test  |
+--------------------+
8 rows in set (0.00 sec)

mysql> exit
Bye

第六步,导入数据

[root@serv01 databackup]# mysql -uroot -p123456 <larrydb.sql

第七步,登录MySQL,查看数据是否正常

[root@serv01 data]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| crm  |
| game  |
| hello  |
| larrydb  |
| mnt  |
| mysql  |
| performance_schema |
| test  |
+--------------------+
9 rows in set (0.00 sec)

mysql> use larrydb;
Database changed
mysql> select * from class;
+------+--------+
| cid | cname |
+------+--------+
| 1 | linux |
| 2 | oracle |
+------+--------+
2 rows in set (0.00 sec)

mysql> select * from stu;
+------+---------+------+
| sid | sname | cid |
+------+---------+------+
| 1 | larry01 | 1 |
| 2 | larry02 | 2 |
+------+---------+------+
2 rows in set (0.00 sec)

对多个库进行备份
第一步,查看有哪些数据库

mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| crm  |
| game  |
| hello  |
| larrydb  |
| mnt  |
| mysql  |
| performance_schema |
| test  |
+--------------------+
9 rows in set (0.00 sec)
mysql> use game;
Database changed
mysql> show tables;
+----------------+
| Tables_in_game |
+----------------+
| country |
| fight  |
| hero  |
+----------------+
3 rows in set (0.00 sec)

mysql> select * from country;
+-----+---------+----------+
| cno | cname | location |
+-----+---------+----------+
| 10 | caowei | luoyang |
| 20 | shuhan | chengdou |
| 30 | sunwu | nanjing |
| 40 | houhan | luoyang |
| 50 | beisong | kaifeng |
| 60 | 魏国 | 洛阳 |
+-----+---------+----------+
6 rows in set (0.00 sec)

第二步,备份多个库

[root@serv01 databackup]# mysqldump -uroot -p123456 --databases larrydb game > larrydb_game.sql
[root@serv01 databackup]# ll larrydb_game.sql
-rw-r--r--. 1 root root 6159 Sep 10 19:05 larrydb_game.sql

第三步,模拟数据丢失。

mysql> drop database game;
Query OK, 3 rows affected (0.01 sec)

mysql> drop database larrydb;
Query OK, 2 rows affected (0.00 sec)
mysql> use crm;
Database changed
mysql> show tables;
+---------------+
| Tables_in_crm |
+---------------+
| test  |
+---------------+
1 row in set (0.00 sec)

mysql> select * from test;
Empty set (0.00 sec)

mysql> drop database crm;
Query OK, 1 row affected (0.00 sec)

第四步,恢复数据

[root@serv01 databackup]# mysql -uroot -p123456 < larrydb_game.sql

第五步,查看数据是否正常

[root@serv01 data]# mysql -uroot -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| game  |
| hello  |
| larrydb  |
| mnt  |
| mysql  |
| performance_schema |
| test  |
+--------------------+
8 rows in set (0.00 sec)

mysql> use game;
Database changed
mysql> select * from country;
+-----+---------+----------+
| cno | cname | location |
+-----+---------+----------+
| 10 | caowei | luoyang |
| 20 | shuhan | chengdou |
| 30 | sunwu | nanjing |
| 40 | houhan | luoyang |
| 50 | beisong | kaifeng |
| 60 | 魏国 | 洛阳 |
+-----+---------+----------+
6 rows in set (0.00 sec)

mysql> use larrydb;
Database changed
mysql> select * from class;
+------+--------+
| cid | cname |
+------+--------+
| 1 | linux |
| 2 | oracle |
+------+--------+
2 rows in set (0.00 sec)

备份所有的库

[root@serv01 databackup]# mysqldump --help | grep all-database
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
 -A, --all-databases Dump all the databases. This will be same as --databases
   --databases= or --all-databases), the logs will be
   --all-databases or --databases is given.
all-databases   FALSE

[root@serv01 databackup]# mysqldump -uroot -p123456 --all-databases > all_databases.sql
[root@serv01 databackup]# ll all_databases.sql -h
-rw-r--r--. 1 root root 506K Sep 10 19:16 all_databases.sql

备份某张表或者某几张表
第一步,备份某张表和某几张表

[root@serv01 databackup]# mysqldump game hero country -uroot -p123456 > game_hero_country.sql
[root@serv01 databackup]# ll game_hero_country.sql
-rw-r--r—. 1 root root 3955 Sep 10 19:11 game_hero_country.sql

第二步,模拟数据丢失

mysql> use game;
Database changed
mysql> show tables;
+----------------+
| Tables_in_game |
+----------------+
| country |
| fight  |
| hero  |
+----------------+
3 rows in set (0.00 sec)

mysql> drop table hero;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table country;
Query OK, 0 rows affected (0.00 sec)

第三步,查看数据是否正常

[root@serv01 databackup]# mysql -uroot -p123456 < game_hero_country.sql
ERROR 1046 (3D000) at line 22: No database selected
[root@serv01 databackup]# mysql -uroot -p123456 --database game < game_hero_country.sql 

[root@serv01 databackup]# mysql -uroot -p123456 -e "select * from game.country"
+-----+---------+----------+
| cno | cname | location |
+-----+---------+----------+
| 10 | caowei | luoyang |
| 20 | shuhan | chengdou |
| 30 | sunwu | nanjing |
| 40 | houhan | luoyang |
| 50 | beisong | kaifeng |
| 60 | 魏国 | 洛阳 |
+-----+---------+----------+

通过这两天关于MySQL热备和冷备的学习,大家是不是对MySQL备份与恢复的了解更加深入了,不管是冷备还是热备其目的都是一致的保证数据的完整性和一致性,切记,备份重于一切!!!

相信今天所学的知识在之后的学习工作中对大家有所帮助。

(0)

相关推荐

  • SQL Server误区30日谈 第28天 有关大容量事务日志恢复模式的误区

    误区 #28:有关大容量事务日志恢复模式的几个误区 28 a)常见的DML操作可以被"最小记录日志"    不是.在大容量事务日志恢复模式下只有一小部分批量操作可以被"最小记录日志",这类操作的列表可以在Operations That Can Be MinimallyLogged找到.这是适合SQL Server 2008的列表,对于不同的SQL Server版本,请确保查看正确的列表. 28 b)使用大容量事务日志恢复模式不会影响灾难恢复    首先,在上次事务日

  • SQL Server恢复模型之批量日志恢复模式

    你是否想知道为什么事务日志文件会变得越来越大?事务日志有时候甚至会比你的实际数据库文件还要大,尤其是在应用数据仓库的情况下.为什么会发生这种情况呢?如何控制其大小?数据库恢复模型如何控制事务日志增长?在本系列文章中,我们就将一一给出解答. 批量日志恢复模式 批量日志恢复模式与完整恢复模式类似,都预期会有大批量的数据修改操作(例如,创建索引,SELECT INTO,INSERT SELECT,BCP,BULKINSERT),在这种情况下可以最小化日志记录量,因此它降低了性能影响.但是同时代价就是你

  • mysql误删root用户恢复方法

    装完数据库清理一些默认账号的时候不小心把root删除了,flush privileges 之后的新 root 忘了grant任何权限,查看mysqld选项里面有个 −−skip-grant-tables 复制代码 代码如下: #/usr/libexec/mysqld --verbos --help mysql5.5手册说明如下 复制代码 代码如下: --skip-grant-tables This option causes the server to start without using t

  • SQL Server无日志恢复数据库(2种方法)

    SQL Server是一个关系数据库管理系统,应用很广泛,在进行SQL Server数据库操作的过程中难免会出现误删或者别的原因引起的日志损坏,又由于SQL Server数据库中数据的重要性,出现了以上的故障之后就必须对数据库中数据进行恢复.下文就为大家介绍一种恢复数据库日志文件的方法. 解决方法一 1.新建一个同名的数据库 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文件覆盖掉这个新建的数据库 4.再重启sql server 5.此时打开企业管理器时会出现置疑,先

  • 配置SQL Server数据库恢复模式(2种方法)

    下面主要介绍配置SQL Server数据库恢复模式的两种方法. 用T-SQL设置恢复模式 你可以使用"ALTER DATABASE"命令加"SET RECOVERY"语句来修改数据库的恢复模式.例如,下面的查询语句把"AdventureWorks"数据库的恢复模式设置为完全恢复模式. ALTER DATABASE AdventureWorks SET RECOVERY FULL ; 你可以查询"sys.databases"的目

  • MySQL备份与恢复之冷备(1)

    用一句话概括冷备,就是把数据库服务,比如MySQL,Oracle停下来,然后使用拷贝.打包或者压缩命令对数据目录进行备份.如果数据出现异常,则可以通过备份数据恢复.冷备一般需要定制计划,比如什么时候做备份,每次对哪些数据进行备份等等.但是由于这样的备份占用过多的空间,对大数据量的环境下不一定适合,故生产环境很少使用. 冷备示意图 冷备实验 第一步,创建测试数据库,插入测试数据 mysql> use larrydb; Database changed mysql> show tables; +-

  • mysql二进制日志文件恢复数据库

    二进制日志的文件的作用 mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句.如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所做的操作,再和数据库备份配合使用,即可再现用户操作,使数据库恢复. 二进制日志文件的弊端 二进制日志文件开启后,所有对数据库操作的记录均会被记录到此文件, 所以,当长时间开启之后,日志文件会变得很大,占用磁盘空间. 使用二进制日志文件恢复数据库 开启日志文件 mysql默认是不开启日志文件的功能的,

  • MySQL备份与恢复之保证数据一致性(5)

    在上一篇文章中我们提到热拷贝(MySQL备份与恢复之热拷贝),热拷贝也就是在MySQL或者其他数据库服务在运行的情况下使用mysqlhotcopy命令进行备份.这篇文章我们讲解怎样保证数据一致性.现在假设有这样一种情况,我们总是在凌晨对数据库进行备份,假设在凌晨之后发生数据库异常,并且导致数据丢失.这样凌晨之前的数据我们已经做了备份,但是凌晨到发生异常这段时间的数据就会丢失(没有binlog的情况下).好在InnoDB存储引擎支持事务,也支持Binlog,凌晨到发生异常这段时间的数据就可以通过日

  • 删除sqlserver数据库日志和没有日志的数据库恢复办法

    一.删除数据库日志文件的方法 你曾经有在执行SQL的时候,数据库报事务日志已满,然后执行报错.然后纠结于怎么删除数据库日志,捣鼓半天吗,现在就提供两种删除日志文件的方法,希望能够帮到你! 方法一:手工操作1.数据库->右键->属性->选项-恢复模式->由完成切换成简单2.数据库->右键->任务->收缩-文件->由完成切换成简单->文件类型->日志->将文件收缩到 方法二:存储过程代替手工操作 复制代码 代码如下: --日志文件收缩至多少M 

  • php实现mysql备份恢复分卷处理的方法

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

  • SQL Server 2005恢复数据库详细图文教程

    不少需要用到sql2005的程序,有很多新手还是会操作,这里写个详细的图文教程送个菜鸟们,高手请飘过.适用于独立主机的朋友使用,如果你还没安装,请按照这个教程来安装 SQL Server 2005图文安装教程,超详细 下面是SQL Server 2005恢复数据库的详细过程 1:打开SQL Server Management Studio并登录,这个一般在开始--程序里面找到 2:鼠标右键单击数据库--新建数据库 3:弹出来的框里,填写数据库名称,我这里填写的是sqlqtdy,这个根据自己需求来

随机推荐