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]下面)。