MySQL備份恢復第一篇
今天學習了下MySQL的備份恢復內容,也算是對之前的 資料匯入匯出的一個細化內容。備份恢復的內容其實還是蠻複雜的,一般網站上提到的備份恢復也基本都是邏輯備份恢復的內容。對於更為高效的備份mysqlbackup和恢復的內容提到的很少,mysqlbackup是需要Licence,需要單獨收費的,這也算是向oracle產品線的一個靠攏了。
首先我們還是走走老路,來看看最基本的邏輯備份恢復吧。我們模擬了3萬多條的資料。然後嘗試恢復回來。
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32046 |
+----------+
1 row in set (0.02 sec)
mysql> select current_timestamp(); --在刪除資料之前,我們先來看看時間戳。
+---------------------+
| current_timestamp() |
+---------------------+
| 2015-04-13 14:52:27 |
+---------------------+
1 row in set (0.00 sec)
然後使用經典工具mysqldump來匯出 test的資料。
[mysql@oel1 ~]$ mysqldump -u test --databases test > exp_test.log
然後我們直接執行exp_test.log檔案
[mysql@oel1 ~]$ mysql -u test < exp_test.log
[mysql@oel1 ~]$
mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> select table_schema,table_name,table_type,engine,create_time from tables where table_schema='test';
+--------------+-------------+------------+--------+---------------------+
| table_schema | table_name | table_type | engine | create_time |
+--------------+-------------+------------+--------+---------------------+
| test | innodb_test | BASE TABLE | InnoDB | 2015-04-13 14:54:09 |
| test | myisam_test | BASE TABLE | MyISAM | 2015-04-13 14:54:09 |
| test | new_test | BASE TABLE | InnoDB | 2015-04-13 14:54:09 |
+--------------+-------------+------------+--------+---------------------+
3 rows in set (0.01 sec)
記錄時間戳的目的就是可以看到表new_test的建立時間是在恢復之後,也就是說在恢復的時候也是刪除了表,然後重建匯入資料。
然後我們再次嘗試透過source執行指令碼來恢復資料,效果也是一樣的。
mysql> source exp_test.log
...
mysql> select count(*)from new_test; --可以看到資料都原原本本的回來了。
+----------+
| count(*) |
+----------+
| 32046 |
+----------+
1 row in set (0.03 sec)
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2015-04-13 14:56:32 |
+---------------------+
1 row in set (0.00 sec)
還可以透過如下的方式來匯出表結構和表資料,然後分別處理。下面兩種方式都是等價的。
mysqldump -u test -T /u02/mysql/dump test
mysqldump -u test --tab=/u02/mysql/dump test
執行後生成的檔案結構如下:.txt是資料內容,.sql是表結構語句。
[mysql@oel1 dump]$ ll
total 948
-rw-r--r-- 1 mysql dba 1349 Apr 13 16:02 innodb_test.sql
-rw-rw-rw- 1 mysql dba 2 Apr 13 16:02 innodb_test.txt
-rw-r--r-- 1 mysql dba 1349 Apr 13 16:02 myisam_test.sql
-rw-rw-rw- 1 mysql dba 2 Apr 13 16:02 myisam_test.txt
-rw-r--r-- 1 mysql dba 1380 Apr 13 16:02 new_test.sql
-rw-rw-rw- 1 mysql dba 943641 Apr 13 16:02 new_test.txt
匯入資料可以使用下面的兩種方式來實現。
[mysql@oel1 dump]$ mysqlimport -u test test /u02/mysql/dump/new_test.txt
test.new_test: Records: 32046 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile '/u02/mysql/dump/new_test.txt' into table new_test;
Query OK, 32046 rows affected (0.23 sec)
Records: 32046 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select count(*)from new_test; --再次匯入資料,資料量就翻倍了。
+----------+
| count(*) |
+----------+
| 64092 |
+----------+
1 row in set (0.05 sec)
一些細節的補充。
下面兩種方式還是存在著較大的差距。我們來看看差別到底都在哪裡。標黃部分就是差別所在。
mysqldump -u test test > b.sql
mysqldump -u test --databases test > a.sql
> sdiff a.sql b.sql
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-- Current Database: `test` <
-- <
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFA <
USE `test`; <
-- <
-- Table structure for table `innodb_test` -- Table structure for table `innodb_test`
在實際工作中,基本上我們不會導個資料重建個資料,所以第二種方式還是推薦的,不建議使用--databases選項。
mysqlimport匯入資料,不能匯入ddl語句
[mysql@oel1 dump]$ mysqlimport -u test test '/u02/mysql/dump/innodb_test.sql'
mysqlimport: Error: 1146, Table 'test.innodb_test' doesn't exist, when using table: innodb_test
-----匯出儲存程式
對於儲存程式來說,可以使用下面的選項來選擇性的匯出,也可以忽略。
--events: Dump Event Scheduler events
--routines: Dump stored procedures and functions
--triggers: Dump triggers for tables
--skip-events, --skip-routines, or --skip-triggers.
只匯出表結構
mysqldump -u test --no-data test > dump-defs.sql
只匯出表中資料
mysqldump -u test --no-create-info test > dump-data.sql
匯出資料中包含儲存程式
mysqldump -u test --no-data --routines --events test > dump-defs.sql
以上基本就是邏輯備份的內容了,說起高效的備份,mysqlbackup效能提升還是很大的。不過企業版本的加強版本,還是需要付費的。下載的時候其實也是很方便的。
透過這個連結 選擇enterprise backup對應的安裝包即可
至於說安裝,其實就是個外掛一樣,完全不需要安裝,解壓的事情,解壓完配置一下環境變數就好了。
[mysql@oel1 ~]$ ll *.zip
-rw-r--r-- 1 mysql dba 4141359 Apr 13 17:37 V59683-01.zip
[mysql@oel1 ~]$ unzip V59683-01.zip
Archive: V59683-01.zip
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz.asc
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz.md5
extracting: README.txt
[mysql@oel1 ~]$ gunzip meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz
[mysql@oel1 ~]$ tar -xvf *.tar
meb-3.11.1-linux-glibc2.5-x86-32bit/
meb-3.11.1-linux-glibc2.5-x86-32bit/mvl.css
meb-3.11.1-linux-glibc2.5-x86-32bit/bin/
meb-3.11.1-linux-glibc2.5-x86-32bit/bin/mysqlbackup
meb-3.11.1-linux-glibc2.5-x86-32bit/README.txt
meb-3.11.1-linux-glibc2.5-x86-32bit/LICENSE.mysql
meb-3.11.1-linux-glibc2.5-x86-32bit/manual.html
[mysql@oel1 ~]$
解壓好以後,直接配置.bash_profile把mysqlbackup配置到裡面就大功告成了。
[mysql@oel1 mysql]$ mysqlbackup --version
MySQL Enterprise Backup version 3.11.1 Linux-2.6.18-274.el5-i686 [2014/11/04]
Copyright (c) 2003, 2014, Oracle and/or its affiliates. All Rights Reserved.
Run mysqlbackup --help for help information.
首先我們還是走走老路,來看看最基本的邏輯備份恢復吧。我們模擬了3萬多條的資料。然後嘗試恢復回來。
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select count(*)from new_test;
+----------+
| count(*) |
+----------+
| 32046 |
+----------+
1 row in set (0.02 sec)
mysql> select current_timestamp(); --在刪除資料之前,我們先來看看時間戳。
+---------------------+
| current_timestamp() |
+---------------------+
| 2015-04-13 14:52:27 |
+---------------------+
1 row in set (0.00 sec)
然後使用經典工具mysqldump來匯出 test的資料。
[mysql@oel1 ~]$ mysqldump -u test --databases test > exp_test.log
然後我們直接執行exp_test.log檔案
[mysql@oel1 ~]$ mysql -u test < exp_test.log
[mysql@oel1 ~]$
mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> select table_schema,table_name,table_type,engine,create_time from tables where table_schema='test';
+--------------+-------------+------------+--------+---------------------+
| table_schema | table_name | table_type | engine | create_time |
+--------------+-------------+------------+--------+---------------------+
| test | innodb_test | BASE TABLE | InnoDB | 2015-04-13 14:54:09 |
| test | myisam_test | BASE TABLE | MyISAM | 2015-04-13 14:54:09 |
| test | new_test | BASE TABLE | InnoDB | 2015-04-13 14:54:09 |
+--------------+-------------+------------+--------+---------------------+
3 rows in set (0.01 sec)
記錄時間戳的目的就是可以看到表new_test的建立時間是在恢復之後,也就是說在恢復的時候也是刪除了表,然後重建匯入資料。
然後我們再次嘗試透過source執行指令碼來恢復資料,效果也是一樣的。
mysql> source exp_test.log
...
mysql> select count(*)from new_test; --可以看到資料都原原本本的回來了。
+----------+
| count(*) |
+----------+
| 32046 |
+----------+
1 row in set (0.03 sec)
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2015-04-13 14:56:32 |
+---------------------+
1 row in set (0.00 sec)
還可以透過如下的方式來匯出表結構和表資料,然後分別處理。下面兩種方式都是等價的。
mysqldump -u test -T /u02/mysql/dump test
mysqldump -u test --tab=/u02/mysql/dump test
執行後生成的檔案結構如下:.txt是資料內容,.sql是表結構語句。
[mysql@oel1 dump]$ ll
total 948
-rw-r--r-- 1 mysql dba 1349 Apr 13 16:02 innodb_test.sql
-rw-rw-rw- 1 mysql dba 2 Apr 13 16:02 innodb_test.txt
-rw-r--r-- 1 mysql dba 1349 Apr 13 16:02 myisam_test.sql
-rw-rw-rw- 1 mysql dba 2 Apr 13 16:02 myisam_test.txt
-rw-r--r-- 1 mysql dba 1380 Apr 13 16:02 new_test.sql
-rw-rw-rw- 1 mysql dba 943641 Apr 13 16:02 new_test.txt
匯入資料可以使用下面的兩種方式來實現。
[mysql@oel1 dump]$ mysqlimport -u test test /u02/mysql/dump/new_test.txt
test.new_test: Records: 32046 Deleted: 0 Skipped: 0 Warnings: 0
mysql> load data infile '/u02/mysql/dump/new_test.txt' into table new_test;
Query OK, 32046 rows affected (0.23 sec)
Records: 32046 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select count(*)from new_test; --再次匯入資料,資料量就翻倍了。
+----------+
| count(*) |
+----------+
| 64092 |
+----------+
1 row in set (0.05 sec)
一些細節的補充。
下面兩種方式還是存在著較大的差距。我們來看看差別到底都在哪裡。標黃部分就是差別所在。
mysqldump -u test test > b.sql
mysqldump -u test --databases test > a.sql
> sdiff a.sql b.sql
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-- Current Database: `test` <
-- <
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFA <
USE `test`; <
-- <
-- Table structure for table `innodb_test` -- Table structure for table `innodb_test`
在實際工作中,基本上我們不會導個資料重建個資料,所以第二種方式還是推薦的,不建議使用--databases選項。
mysqlimport匯入資料,不能匯入ddl語句
[mysql@oel1 dump]$ mysqlimport -u test test '/u02/mysql/dump/innodb_test.sql'
mysqlimport: Error: 1146, Table 'test.innodb_test' doesn't exist, when using table: innodb_test
-----匯出儲存程式
對於儲存程式來說,可以使用下面的選項來選擇性的匯出,也可以忽略。
--events: Dump Event Scheduler events
--routines: Dump stored procedures and functions
--triggers: Dump triggers for tables
--skip-events, --skip-routines, or --skip-triggers.
只匯出表結構
mysqldump -u test --no-data test > dump-defs.sql
只匯出表中資料
mysqldump -u test --no-create-info test > dump-data.sql
匯出資料中包含儲存程式
mysqldump -u test --no-data --routines --events test > dump-defs.sql
以上基本就是邏輯備份的內容了,說起高效的備份,mysqlbackup效能提升還是很大的。不過企業版本的加強版本,還是需要付費的。下載的時候其實也是很方便的。
透過這個連結 選擇enterprise backup對應的安裝包即可
至於說安裝,其實就是個外掛一樣,完全不需要安裝,解壓的事情,解壓完配置一下環境變數就好了。
[mysql@oel1 ~]$ ll *.zip
-rw-r--r-- 1 mysql dba 4141359 Apr 13 17:37 V59683-01.zip
[mysql@oel1 ~]$ unzip V59683-01.zip
Archive: V59683-01.zip
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz.asc
extracting: meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz.md5
extracting: README.txt
[mysql@oel1 ~]$ gunzip meb-3.11.1-linux-glibc2.5-x86-32bit.tar.gz
[mysql@oel1 ~]$ tar -xvf *.tar
meb-3.11.1-linux-glibc2.5-x86-32bit/
meb-3.11.1-linux-glibc2.5-x86-32bit/mvl.css
meb-3.11.1-linux-glibc2.5-x86-32bit/bin/
meb-3.11.1-linux-glibc2.5-x86-32bit/bin/mysqlbackup
meb-3.11.1-linux-glibc2.5-x86-32bit/README.txt
meb-3.11.1-linux-glibc2.5-x86-32bit/LICENSE.mysql
meb-3.11.1-linux-glibc2.5-x86-32bit/manual.html
[mysql@oel1 ~]$
解壓好以後,直接配置.bash_profile把mysqlbackup配置到裡面就大功告成了。
[mysql@oel1 mysql]$ mysqlbackup --version
MySQL Enterprise Backup version 3.11.1 Linux-2.6.18-274.el5-i686 [2014/11/04]
Copyright (c) 2003, 2014, Oracle and/or its affiliates. All Rights Reserved.
Run mysqlbackup --help for help information.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26845409/viewspace-1579235/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql備份恢復MySql
- mysql 備份恢復MySql
- 【MySQL】MySQL備份和恢復MySql
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- MySQL備份與恢復MySql
- Mysql備份和恢復MySql
- MySQL 備份與恢復MySql
- Mysql備份與恢復(1)---物理備份MySql
- mysql innobackupex增量備份恢復MySql
- MySql邏輯備份恢復MySql
- Mysql的備份與恢復MySql
- mysql備份恢復測試MySql
- MySQL 備份和恢復 一MySql
- Mysql 備份與恢復 二MySql
- MySQL 非常規恢復與物理備份恢復MySql
- Mysql備份與恢復(2)---邏輯備份MySql
- MySQL備份與恢復——基於MyDumper/MyLoader 邏輯備份恢復MySql
- 入門MySQL——備份與恢復MySql
- docker 中 MySQL 備份及恢復DockerMySql
- 《入門MySQL—備份與恢復》MySql
- MySQL備份與恢復操作解析MySql
- Mysql資料備份與恢復MySql
- MySQL備份與恢復——實操MySql
- MySQL備份與恢復簡介MySql
- 【MySql】innobackupex增量備份和恢復MySql
- mysql備份恢復mysqldump面面觀MySql
- Effective MySQL之備份與恢復MySql
- Linux下mysql備份 恢復LinuxMySql
- MySQL innobackupex全量備份恢復MySql
- 【MySql】innobackupex 增量備份和恢復MySql
- MySQL備份與恢復——基於OUTFILE /LOAD DATA 邏輯備份恢復MySql
- mysql之 Innobackupex(全備+增量)備份恢復MySql
- 【備份恢復】從備份恢復資料庫資料庫
- 【管理篇備份恢復】備份恢復基礎
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- MySQL入門--備份與恢復(一)MySql
- MySQL入門--備份與恢復(二)MySql
- MySQL入門--備份與恢復(三)MySql