1. 程式人生 > >MySQL 資料庫增量備份與恢復資料命令實戰

MySQL 資料庫增量備份與恢復資料命令實戰

1. 備份單個數據庫練習 mysqldump 命令多種引數的使用

1.1 調整 MySQL 客戶端及服務端字符集為建庫建表時預設的 latin1,避免備份時的亂碼問題

[[email protected] ~]# vi /etc/my.cnf

[[email protected] ~]# sed -n '18,19p' /etc/my.cnf

[client]

default-character-set=latin1   #  把 MySQL 客戶端字符集改為預設的拉丁。

[[email protected] ~]# sed -n '27,28p' /etc/my.cnf

[mysqld]

character-set-server=latin1    #  把 MySQL 服務端字符集改為預設的拉丁。

1.2 MySQL 資料庫的備份命令 mysqldump 基本語法

mysqldump -u 使用者名稱 -p 資料庫名 >備份的檔名

1.3 備份並恢復 oldboy 庫

1.3.1 備份

[[email protected] ~]# mysql -uroot -p111111

mysql> use oldboy   

mysql> select * from student;

   #  檢視備份前資料。

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷       |

[[email protected] ~]# mysqldump -uroot -p'111111' oldboy >/opt/mysql_bak.sql  #  備份。

[[email protected] ~]# egrep -v "#|\*|--|^$" /opt/mysql_bak.sql    #  檢視備份資料內容。

DROP TABLE IF EXISTS `student`;   #  刪除表(恢復資料時會刪除老的表)

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

LOCK TABLES `student` WRITE;   #  鎖表。

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'張雷');   #  一條語句插入資料減少磁碟 I/O 。

UNLOCK TABLES;

[[email protected] ~]# mysqldump -uroot -p'111111' --default-character-set=latin1 oldboy >/opt/mysql_bak.sql    #  指定字符集匯出資料也可以避免亂碼問題。

1.3.2 測試恢復資料             

[[email protected] ~]# mysql -uroot -p111111 -e "use oldboy;drop table student;"  

#  刪除 student 表,模擬資料庫丟失場景。(備份檔案中預設包含刪表語句)

[[email protected] ~]# mysql -uroot -p111111 -e "select * from oldboy.student;"

ERROR 1146 (42S02) at line 1: Table 'oldboy.student' doesn't exist    #  該表已不存在。

[[email protected] ~]# mysql -uroot -p'111111' oldboy </opt/mysql_bak.sql  #  恢復資料。

[[email protected] ~]# mysql -uroot -p111111 -e "select * from oldboy.student;"  

 #檢視恢復資料的結果(可以看到資料恢復成功)。

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷        |

1.4 加 -B 引數備份名字為 oldboy 的庫

1.4.1 備份

[[email protected] ~]# mysqldump -uroot -p'111111' -B oldboy >/opt/mysql_bak_B.sql

[[email protected] ~]# cd /opt

[[email protected] opt]# diff mysql_bak.sql mysql_bak_B.sql

>

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

>

> USE `oldboy`;

-B 引數的作用之一:

該引數實現了在備份資料中新增一條自動建立備份的資料庫(如果該庫不存在)的 SQL 語句和切換資料庫的 SQL 語句的功能。【生產場景要加該引數】

1.4.2 登陸資料庫模擬丟失 oldboy 庫的場景

[[email protected] opt]# mysql -uroot -p111111

mysql> show databases;

mysql> drop database oldboy;

1.4.3 恢復資料

[[email protected] opt]# mysql -uroot -p'111111' oldboy </opt/mysql_bak.sql

ERROR 1049 (42000): Unknown database 'oldboy'

#  用前面的備份資料恢復不成功,提示未知的 oldboy 庫。(因為已經刪除)

[[email protected] opt]# mysql -uroot -p'111111' </opt/mysql_bak_B.sql

#  用加 -B 引數的備份恢復資料庫(無需指定庫,自動建立)。

[[email protected] opt]# mysql -uroot -p111111 -e "select * from oldboy.student;"   

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷        |

1.5 指定壓縮命令壓縮備份的 MySQL 資料

[[email protected] ~]# ll /opt/

-rw-r--r--  1 root root   2150 4月  10 20:18 mysql_bak_B.sql

-rw-r--r--  1 root root   2005 4月  10 20:06 mysql_bak.sql

[[email protected] ~]# mysqldump -uroot -p'111111' -B oldboy|gzip >/opt/mysql_bak_B.sql.gz

[[email protected] ~]# ll /opt/  #  壓縮效率接近三倍。

-rw-r--r--  1 root root   2150 4月  10 20:18 mysql_bak_B.sql

-rw-r--r--  1 root root   2005 4月  10 20:06 mysql_bak.sql

-rw-r--r--  1 root root    848 4月  10 20:42 mysql_bak_B.sql.gz

小結:① 匯出資料加 -B 引數;② 用 gzip 對匯出資料進行壓縮。

1.6 mysqldump 工作原理

利用 mysqldump 命令備份資料的過程,實際上就是把資料從 MySQL 庫裡以邏輯的 SQL 語句的形式直接輸出或者生成備份的檔案的過程。

1.6.1 備份的資料過濾掉註釋都是 SQL 語句,結果如下

[[email protected] ~]# egrep -v "#|\*|--|^$" /opt/mysql_bak_B.sql

USE `oldboy`;

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

LOCK TABLES `student` WRITE;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'張雷');

UNLOCK TABLES;

2. 備份多個數據庫練習 mysqldump 命令多種引數的使用

2.1 備份資料庫中的 oldboy 和 oldboy_gbk 兩個庫

mysql> show databases;    #  檢視資料庫。

| Database           |

| information_schema |

| oldboy            |

| oldboy_gbk   |

[[email protected] ~]# mysqldump -uroot -p'111111' -B oldboy oldboy_gbk|gzip >/opt/mul.sql.gz

-B 引數的說明:

-B 引數很關鍵,表示接多個庫,並且增加 create database db 和 use db 的資訊。該引數用於匯出若干個資料庫,在備份結果中會加入建立庫和切換庫的語句。

2.2 分庫備份:每個庫備份成單個對應的備份檔案

2.2.1 方法一:通過命令列一條命令實現備份

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"

bbs

mysql

oldboy

oldboy_gbk

oldboy_utf8

wordpress

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed 's#^#mysqldump -uroot -p'111111' -B #g'

mysqldump -uroot -p111111 -B bbs

mysqldump -uroot -p111111 -B mysql

mysqldump -uroot -p111111 -B oldboy

mysqldump -uroot -p111111 -B oldboy_gbk

mysqldump -uroot -p111111 -B oldboy_utf8

mysqldump -uroot -p111111 -B wordpress

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1 >/opt/\1 #g'

mysqldump -uroot -p111111 -B bbs >/opt/bbs

mysqldump -uroot -p111111 -B mysql >/opt/mysql

mysqldump -uroot -p111111 -B oldboy >/opt/oldboy

mysqldump -uroot -p111111 -B oldboy_gbk >/opt/oldboy_gbk

mysqldump -uroot -p111111 -B oldboy_utf8 >/opt/oldboy_utf8

mysqldump -uroot -p111111 -B wordpress >/opt/wordpress

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1 >/opt/\1.sql #g'

mysqldump -uroot -p111111 -B bbs >/opt/bbs.sql

mysqldump -uroot -p111111 -B mysql >/opt/mysql.sql

mysqldump -uroot -p111111 -B oldboy >/opt/oldboy.sql

mysqldump -uroot -p111111 -B oldboy_gbk >/opt/oldboy_gbk.sql

mysqldump -uroot -p111111 -B oldboy_utf8 >/opt/oldboy_utf8.sql

mysqldump -uroot -p111111 -B wordpress >/opt/wordpress.sql

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1|gzip >/opt/\1.sql #g'

mysqldump -uroot -p111111 -B bbs|gzip >/opt/bbs.sql

mysqldump -uroot -p111111 -B mysql|gzip >/opt/mysql.sql

mysqldump -uroot -p111111 -B oldboy|gzip >/opt/oldboy.sql

mysqldump -uroot -p111111 -B oldboy_gbk|gzip >/opt/oldboy_gbk.sql

mysqldump -uroot -p111111 -B oldboy_utf8|gzip >/opt/oldboy_utf8.sql

mysqldump -uroot -p111111 -B wordpress|gzip >/opt/wordpress.sql

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' -B \1|gzip >/opt/\1.sql.gz #g'|bash

-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' --events  -B \1|gzip >/opt/\1.sql.gz #g'|bash   

[[email protected] ~]# mkdir /opt/bak   #  為了更明顯的效果,建立存放備份的目錄。

[[email protected] ~]# mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'111111' --events  -B \1|gzip >/opt/bak/\1.sql.gz #g'|bash

[[email protected] ~]# ll /opt/bak   

總用量 392

-rw-r--r-- 1 root root 226932 4月  11 00:18 bbs.sql.gz

-rw-r--r-- 1 root root 144461 4月  11 00:18 mysql.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:18 oldboy_gbk.sql.gz

-rw-r--r-- 1 root root    861 4月     11 00:18 oldboy.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:18 oldboy_utf8.sql.gz

-rw-r--r-- 1 root root  10189 4月   11 00:18 wordpress.sql.gz

2.2.2 方法二:通過 Shell 指令碼實現分庫備份

[[email protected] ~]# cd /server/scripts

[[email protected] scripts]# cat fenku.sh

#!/bin/bash

for dbname in `mysql -uroot -p'111111' -e "show databases;"|grep -Evi "database|infor|perfor"`

do

mysqldump -uroot -p'111111' --events  -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz

done

[[email protected] scripts]# sh fenku.sh

[[email protected] scripts]# ll /opt/bak/

總用量 784

-rw-r--r-- 1 root root 226932 4月  11 00:36 bbs_bak.sql.gz

-rw-r--r-- 1 root root 144461 4月  11 00:36 mysql_bak.sql.gz

-rw-r--r-- 1 root root    861 4月     11 00:36 oldboy_bak.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:36 oldboy_gbk_bak.sql.gz

-rw-r--r-- 1 root root    540 4月     11 00:36 oldboy_utf8_bak.sql.gz

-rw-r--r-- 1 root root  10188 4月   11 00:36 wordpress_bak.sql.gz

2..3 分庫備份的意義

        有時一個企業的資料庫裡會有多個庫。例如 bbs、wordpress、bbs、blog 等,但是出問題的可能只是某一個庫,如果在備份時把所有的庫都備份成了一個數據庫檔案的話,恢復某個資料庫的資料時就會比較麻煩。為了避免這個麻煩,需要分庫備份。

3. 備份單個表練習 mysqldump 命令多種引數的使用

語法:mysqldump -u 使用者名稱 -p 資料庫名 表名 >備份的檔名

示例:mysqldump -uroot -p111111  oldboy student >/opt/table1.sql

詳細的操作過程

[[email protected] scripts]# mysql -uroot -p111111

mysql> show databases;

mysql> use oldboy

mysql> show tables;

| Tables_in_oldboy |

| student      |

mysql> select * from student;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷        |

[[email protected] scripts]# mysqldump -uroot -p111111 --compact oldboy student

# --compact 引數可減少輸出,展示備份資料的內容。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

/*!40101 SET character_set_client = @saved_cs_client */;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'張雷');

[[email protected] scripts]# mysqldump -uroot -p111111  oldboy student >/opt/table_student.sql   #  備份。

[email protected] scripts]# ll /opt/table_student.sql

-rw-r--r-- 1 root root 2005 4月  11 01:03 /opt/table_student.sql

4. 備份多個表練習 mysqldump 命令多種引數的使用

4.1 將多個表備份成一個檔案

語法:mysqldump -u 使用者名稱 -p 資料庫名 表名1 表名2 >備份的檔名

詳細的操作過程

mysql> use oldboy

Database changed

mysql> create table test(id int);   #  在 oldboy 庫再建立一個表(準備工作)。

mysql> show tables;          

| student       |

| test             |

[[email protected] ~]# mysqldump -uroot -p111111 --compact  oldboy student test

#  減少輸出展示資料的內容。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'張雷');

CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[[email protected] ~]# mysqldump -uroot -p111111  oldboy student test >/opt/table_stu_test.sql   #  備份。

[[email protected] ~]# ll /opt/table_stu_test.sql

-rw-r--r-- 1 root root 2504 4月  11 01:13 /opt/table_stu_test.sql

4.2 分表備份

        有時企業會有此類需求:一個庫裡有大表有小表,有時可能需要只恢復某一個小表,上述的多表備份檔案很難拆開,就會像沒有分庫那樣導致恢復某一個小表很麻煩,於是就需要進行分表備份。和分庫備份的思路一樣,每執行一條語句備份一個表,生成不同的資料檔案即可。詳細的指令碼內容見 Shell 程式設計課程(略)。

分表備份的缺點:檔案多而碎。

4.3 恢復資料的思路

① 備一個完整全備,再做一個分庫分表備份(不適合資料量特別大的場景);

② 指令碼批量恢復多個 SQL 檔案。

4.4 備份資料庫表結構及只備份資料

利用 mysqldump 的 -d 引數只備份表的結構,例如:備份 oldboy 庫的所有表結構:

[[email protected]~] mysqldump -uroot -p'111111' --compact  -d oldboy    # 備份庫下所有表結構。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

CREATE TABLE `test` (

  `id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[[email protected] ~]# egrep -v "#|\*|--|^$" /opt/t.sql

[[email protected]~]# mysqldump -uroot -p'111111' --compact  -d oldboy student

# 備份庫下指定的 student 表的表結構。

CREATE TABLE `student` (

  `id` int(4) NOT NULL AUTO_INCREMENT,

  `name` char(20) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

利用 -t 引數只備份表的資料,例如:備份 oldboy 庫的 student 表資料:

[[email protected] ~]# mysqldump -uroot -p'111111' --compact -t oldboy student

INSERT INTO `student` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka'),(6,'老男孩'),(7,'老男孩'),(8,'老男人'),(9,'張雷');

利用 mysqldump 的 -T 引數可以把表的結構和資料分開備份(不常用)。

利用 mysqldump 的 -A 引數可以備份資料庫所有資料:

[[email protected]~]#mysqldump -uroot -p'111111' -A -B --events|gzip >/opt/a.sql.gz

5. mysqldump 關鍵引數補充

① 重新整理 binlog 的引數 -F

[[email protected] ~]# vi /etc/my.cnf   #  編輯配置檔案,開啟 binlog 的註釋。

log-bin=mysql-bin

[[email protected] ~]# /etc/init.d/mysqld restart   #  重啟資料庫。

[[email protected] ~]# mysqldump -uroot -p'111111' -A -B -F --events|gzip >/opt/a.sql.gz

[[email protected] ~]# ll /application/mysql/data/

-rw-rw---- 1 mysql mysql      856 4月  11 02:00 mysql-bin.000001

-rw-rw---- 1 mysql mysql      150 4月  11 02:00 mysql-bin.000002

-rw-rw---- 1 mysql mysql      150 4月  11 02:00 mysql-bin.000003

提示:每次重新整理 binlog 備份,恢復資料時只需恢復全備及增量,增量前面的 binlog 是和全備重複的資料。

② 重要引數 --master-data    

[[email protected] ~]# mysqldump -uroot -p'111111' --master-data=1 --compact oldboy

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=107;

#  使用 --master-data=1 引數,會自動指定 binlog 的檔案和位置,這樣就可以不切割日誌,恢復資料時只需恢復該檔案下的增量資料即可。(主從同步)

[[email protected] ~]# mysqlbinlog /application/mysql/data/mysql-bin.000013  #  檢視 binlog 內容。

引數 --master-data 還可以等於 2:

[[email protected] ~]# mysqldump -uroot -p'111111' --master-data=2 --compact oldboy

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=107;   #  前面多了註釋。

6. mysqldump 命令關鍵引數說明

6.1 mysqldump --help 引數

        ① -B 指定多個庫,增加建庫語句和 use 語句;

        ② --compact 去掉註釋,適合除錯輸出,生產場景不用該引數;

        ③ -A 備份所有庫。

        ④ -F 重新整理 binlog 日誌;

        ⑤ --master-data  增加 binlog 日誌檔名及對應的位置點;

        ⑥ -x,--lock-all-tables   鎖表(保持資料一致性);

        ⑦ -l,--lock-tables  鎖表(只讀);

        ⑧ -d 只備份表結構;

        ⑨ -t  只備份資料;

        ⑩ 適合 InnoDB 事務資料庫備份:--single-transaction

        InnoDB 表在備份時,通常啟用選項 --single-transaction 來保證備份的一致性,實際上它的工作原理是設定本次會話的

隔離級別為:REPEATABLE READ 以確保本次會話(dump)時,不會看到其他會話已經提交了資料。

補充:--master-data

        --master-data=1:告訴從庫應該從主庫的哪個點進行增量恢復。

[[email protected] ~]# mysqldump -uroot -p111111 --master-data=1 --events oldboy student

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=107;

        --master-data=2:

[[email protected] ~]# mysqldump -uroot -p111111 --master-data=2 --events oldboy student

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=107;

 6.2 不同引擎的備份命令

        MyISAM 引擎的備份命令:

mysqldump -uroot -p111111 -A -B --master-data=2 -x --events|gzip >/opt/all.sql.gz

        InnoDB 引擎的備份命令:【推薦使用】

mysqldump -uroot -p111111 -A -B --master-data=2  --events --single-transaction|gzip >/opt/all.sql.gz

7. 恢復資料庫實戰

7.1 利用 source 命令恢復資料庫      

[[email protected] ~]# mysql -uroot -p'111111'    #  登陸資料庫。    

mysql> show databases;

|bbs                 |

| mysql            |

| oldboy           |

| oldboy_gbk   |

| oldboy_utf8   |

| wordpress     |

mysql> drop database oldboy;   # 刪除 oldboy 庫測試恢復。

mysql> show databases;

|bbs                 |

| mysql            |

| oldboy_gbk   |

| oldboy_utf8   |

| wordpress     |

mysql> system ls /opt   #  檢視系統 /opt 下的備份檔案。

mysql_bak_B.sql

mysql> source /opt/mysql_bak_B.sql   #  用 source 命令恢復資料庫。

mysql> show databases;    #  檢視恢復結果(恢復成功)。        

| bbs                  |

| mysql              |

| oldboy             |

| oldboy_gbk     |

mysql> set names latin1;

mysql> select * from oldboy.student;

| id | name      |

+----+-----------+

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷        |

提示:如果備份檔案在登陸資料庫前的路徑下,source 命令可以直接在相對路徑恢復資料。

7.2 標準的利用 mysql 命令恢復資料

[[email protected] ~]# cd /opt

[[email protected] opt]# gzip -d  mysql.sql.gz    #  加 -d 引數的解壓會刪除原始檔。

[[email protected] opt]# ll mysql.sql.gz  

ls: 無法訪問mysql.sql.gz: 沒有那個檔案或目錄

[[email protected] opt]# mysql -uroot -p111111 </opt/mysql.sql   #  恢復資料。

7.3 分庫分表備份的資料如何快速恢復

通過 Shell 指令碼讀指定的庫和表,呼叫 mysql 命令恢復:

[[email protected] bak]# mysql -uroot -p'111111'

mysql> show databases;

bbs       

mysql       

oldboy         

oldboy_gbk

oldboy_utf8      

wordpress    

mysql> drop database bbs;   

mysql> drop database mysql;

mysql> drop database oldboy;

mysql> drop database oldboy_gbk;

mysql> drop database oldboy_utf8;

mysql> drop database wordpress;  

mysql> show databases;   #  資料庫中沒有上面的庫了。         

| Database           |

| information_schema |

| performance_schema |

[[email protected] bak]# pwd

/opt/bak

[[email protected] bak]# gzip -d *   #  全部解壓。

[[email protected] bak]# ls

bbs_bak.sql    oldboy_bak.sql      oldboy_utf8_bak.sql

mysql_bak.sql  oldboy_gbk_bak.sql  wordpress_bak.sql

[[email protected] bak]# ls *.sql|sed 's#_bak.sql##g'   #  取出庫名。

bbs

mysql

oldboy

oldboy_gbk

oldboy_utf8

wordpress

[[email protected] bak]# for dbname in `ls *.sql|sed 's#_bak.sql##g'` ;do mysql -uroot -p'111111' < ${dbname}_bak.sql;done

#  通過 Shell 指令碼 FOR 迴圈恢復資料庫。

[[email protected] bak]# mysql -uroot -p'111111'  

mysql> show databases;    #  檢查恢復結果(成功)。     

| Database          |

| bbs                    |

| mysql                |

| oldboy               |

| oldboy_gbk       |

| oldboy_utf8       |

| wordpress         |

mysql> set names latin1;

mysql> select * from oldboy.student;

| id | name      |

|  1 | oldboy    |

|  2 | oldgirl     |

|  3 | inca        |

|  4 | zuma      |

|  5 | kaka       |

|  6 | 老男孩    |

|  7 | 老男孩    |

|  8 | 老男人    |

|  9 | 張雷        |

8. MySQL 引數 -e 實現非互動式會話

mysql -uroot -p'111111' -e "show databases;"

[[email protected] ~]# mysql -uroot -p'111111' -e "set names latin1;use oldboy;select * from student;"

8.1 檢視當前資料庫的請求連線

[[email protected] ~]# mysql -uroot -p'111111' -e "show processlist;"

+----+--------+------------+---------+--------------+--------+--------+-----------------------+

| Id   | User  | Host       | db       | Command | Time | State |     Info                  |

+----+--------+------------+---------+---------------+-------+--------+-----------------------+

| 17  | root   | localhost | NULL | Query        |    0    | NULL | show processlist |

+----+--------+------------+---------+---------------+-------+-------+------------------------+

提示:如果兩次甚至多次 show processlist 仍有一個語句還在,可能就是慢查詢,可能就需要建索引。

[[email protected] ~]# mysql -uroot -p'111111' -e "show full processlist;"

+----+--------+------------+---------+--------------+--------+--------+---------------------------+

| Id   | User  | Host       | db       | Command | Time | State |     Info                       |

+----+--------+------------+---------+---------------+-------+--------+---------------------------+

| 17  | root   | localhost | NULL | Query        |    0    | NULL | show full processlist |

+----+--------+------------+---------+---------------+-------+-------+----------------------------+

8.2 檢視 MySQL 的變數 

[[email protected] ~]# mysql -uroot -p'111111' -e "show variables;"

[[email protected] ~]# mysql -uroot -p'111111' -e "show variables;"|grep log_bin

log_bin ON    #  可以看到 log_bin 處於開啟狀態。

log_bin_trust_function_creators OFF

sql_log_bin     ON

[[email protected] ~]# grep log-bin /etc/my.cnf    # 和此處的引數對應。

log-bin=mysql-bin

8.3 檢視 MySQL 的狀態

[[email protected] ~]# mysql -uroot -p'111111' -e "show status;"   #  當前會話的狀態。

[[email protected] ~]# mysql -uroot -p'111111' -e "show global status;"  #  檢視全域性狀態。

[email protected] ~]# mysql -uroot -p'111111' -e "show global status;"|grep select

Com_select      51

[[email protected] ~]# mysql -uroot -p'111111' -e "show global status;"|grep insert

Com_insert      85

mysql> use oldboy

mysql> create table test(id int);

mysql> insert into test values(2);

mysql> show global status like '%insert%';

| Variable_name      | Value |

| Com_insert            | 86      |

mysql> insert into test values(3);        

mysql> show global status like '%insert%';

| Variable_name       | Value |

| Com_insert             | 87    |

8.4 資料庫引數修改

不重啟資料庫修改資料庫引數,但是要求重啟後還能生效:

[[email protected] ~]# grep key_buffer /etc/my.cnf

key_buffer_size = 16K   #  MyISAM 引擎存放索引的緩衝區。

key_buffer_size = 8M

mysql> show variables like 'key_buffer%';

| Variable_name  | Value  |

| key_buffer_size | 16384 |

mysql> set global key_buffer_size=1024*1024*32;  把索引緩衝區改為 32M。

mysql> show variables like 'key_buffer%';      

| Variable_name   | Value        |

| key_buffer_size  | 33554432 |

mysql> Bye

[[email protected] ~]# mysql -uroot -p'111111'

mysql> show variables like 'key_buffer%';   #  退出再回來依舊生效。

| Variable_name   | Value    |

| key_buffer_size | 33554432 |

[[email protected] ~]# /etc/init.d/mysqld restart

mysql> show variables like 'key_buffer%';  #  可以看到重啟後失效了。     

| Variable_name   | Value |

| key_buffer_size | 16384 |

所以要先在全局裡面改,再改配置檔案:此時無論是否重啟都生效。

mysql> set global key_buffer_size=1024*32;

mysql> show variables like 'key_buffer%';

| Variable_name   | Value |

| key_buffer_size | 32768 |

[[email protected] ~]# vi /etc/my.cnf

[[email protected] ~]# grep key_buffer_size /etc/my.cnf        

key_buffer_size = 32K

8.5 生產場景常用命令小結

show status;                  檢視當前會話的資料庫狀態資訊。    

show global status;        檢視整個資料庫執行狀態資訊,需要分析並做好監控。(很重要)

show processlist;           檢視正在執行的 SQL 語句,看不全。

show full processlist;      檢視正在執行的完整 SQL 語句。

show variables;               檢視資料庫的引數資訊,例如:my.cnf 裡引數的生效情況。

set global key_buffer_size = 32777218  不重啟服務直接生效,重啟後失效。

8.6 其他相關知識

mysqlbinlog 命令作用:

        解析 MySQL 的 binlog 日誌。

MySQL 的 binlog 日誌的作用:

        用來記錄 MySQL 內部增刪改查等對 MySQL 資料庫有更新的內容的記錄。

恢復資料的多種方式:

        ①  擷取 binlog 日誌中指定的庫的內容:-d 引數。

[[email protected] ~]# mysqlbinlog --help

 -d, --database=name List entries for just this database (local log only).

        例如:

mysqlbinlog -d oldboy nysql-bin.000020 >oldboy.sql

        ② 按照位置擷取:

        例如:

mysqlbinlog mysqlbin.000020 --start-position=365  --stop-position=456 -r pos.sql

        ③ 按照時間擷取:

        例如:

mysqlbinlog mysqlbin.000020 --start-datetime='2014-10-16 17:14:15'  --stop-datetime='2014-10-16 17:15:15' -r time.sql

binlog 功能的開啟:

[[email protected] ~]# grep mysql-bin /etc/my.cnf

log-bin=mysql-bin   #  該行去掉註釋(放在 [mysqld]下面)。