程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> MySQL備份與恢復之熱備

MySQL備份與恢復之熱備

編輯:MYSQL入門知識
 

一 熱備

在上兩篇文章(MySQL備份與恢復之冷備,MySQL備份與恢復之真實環境使用冷備)中,我們提到了冷備和真實環境中使用冷備。那從這篇文章開始我們看下熱備。顯然熱備和冷備是兩個相對的概念,冷備是把數據庫服務,比如MySQL,Oracle停下來,然後使用拷貝、打包或者壓縮命令對數據目錄進行備份;那麼我們很容易想到熱備就是在MySQL或者其他數據庫服務在運行的情況下進行備份。但是,這裡存在一個問題,因為生產庫在運行的情況下,有對該庫的讀寫,讀寫頻率有可能高,也可能低,不管頻率高低,總會就會造成備份出來的數據和生產庫中的數據不一致的情況。熱備這段時間,其他人不可以操作是不現實的,因為你總不可能終止用戶訪問Web程序。要解決這個問題,可以采用指定備份策略,比如哪個時間段進行備份,備份哪些數據等等,總之,保證數據的完整性和一致性,切記,備份重於一切!!!

熱備采用的是使用mysqldump命令進行備份,此工具是MySQL內置的備份和恢復工具,功能強大,它可以對整個庫進行備份,可以對多個庫進行備份,可以對單張表或者某幾張表進行備份。但是無法同時備份多個庫多個表,只有分開備份。下面我們看下熱備的示意圖,並進行熱備模擬。

二 示意圖

MySQL備份與恢復之熱備示意圖

三 熱備模擬

對單個庫進行備份

第一步,移除LVM快照。(如果沒有創建,忽略此步)

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服務啟動。

/etc/init.d/mysqld status
SUCCESS! MySQL running (2664)

第四步,導出單個數據庫。

cd /databackup/

# 本質是導出為SQL
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

將輸出結果保存到文件中。

mysqldump -uroot -p123456 --database larrydb > larrydb.sql

第五步,模擬數據丟失,進入MySQL,刪除數據庫。

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

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 data]#

第六步,導入數據。

mysql -uroot -p123456 <larrydb.sql

第七步,登錄MySQL,查看數據是否正常。

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

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)

第二步,備份多個庫。

mysqldump -uroot -p123456 --databases larrydb game > larrydb_game.sql
ll 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)

第四步,恢復數據。

mysql -uroot -p123456 < larrydb_game.sql

第五步,查看數據是否正常。

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

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)

備份所有的庫

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

mysqldump -uroot -p123456 --all-databases > all_databases.sql

ll all_databases.sql -h

備份某張表或者某幾張表

第一步,備份某張表和某幾張表

mysqldump game hero country -uroot -p123456 > game_hero_country.sql
ll 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)

第三步,查看數據是否正常。

mysql -uroot -p123456 --database game < game_hero_country.sql

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 | 魏國 | 洛陽 |
+-----+---------+----------+

–EOF–

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved