mysql備份及恢復

1. 備份數據的意義

    常常有網友問,運維工做究竟是什麼工做,到底作什麼?其實,運維工做簡單的歸納就兩件事,第一個是保護公司的數據,第二個是網站7*24小時提供服務。mysql

    而對於數據和網站7*24小時提供服務那個跟重要呢?linux

    這個具體要看業務和公司。面試

    例如:銀行,金融行業,數據是最重要的,一條都不能丟,可能宕機停機影響就沒那麼大。sql

    再例如:百度搜索,騰訊qq聊天記錄丟失幾萬條數據,都不算啥。數據庫

    對於數據來說,數據最核心的就是數據庫核數據,固然也包括其餘數據,如下主要講解的是數據庫的數據。vim

   對於絕大數企業來說,時區數據就時區商機,時區產品,時區客戶,公司倒閉…….,所以,數據庫的備份與恢復就顯得十分重要了。緩存

 

備份的兩種方式:session

    1. 邏輯備份:以SQL語句的形式,將數據導出,速度慢,跨平臺,跨版本,能夠跨軟件。app

    2. 物理備份,直接對數據文件備份,cp tar,速度快,不容易跨平臺、跨版本。跨軟件,經常使用方法:         linux備份工具(cp tar)。運維

     3. xtrabackup

2. 數據庫備份

2.1 備份單個數據庫練習多種參數使用

   mysql數據庫自帶了一個很好用的備份命令,就是mysqldump,它的基本使用以下:

 

  • 命令語法:mysqldump -u 用戶名-p密碼 數據庫名 > 備份的文件名

     

 

以下5個範例目錄:

(1)備份名字爲oldboy數據庫

(2)解決備份文件亂碼問題

(3)利用上述備份數據進行回覆測試

(4)備份時使用-B參數和不適用-B參數的區別及兩種備份方法。

(5)優化使用—compact參數使備份文件不輸出註釋,優化空間。

(6)指定壓縮命令壓縮備份的MySQL數據

 

範例操做以下:

 

(1)範例1:備份名字爲oldboy的庫

 

1. 備份前查看oldboy數據

 

[root@db01 /]# mysql -U -uroot -poldboy123 -S /data/3306/mysql.sock
--------
    ---------
mysql> show databases; 
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| mysql               |
| oldboy              |
+---------------------+
6 rows in set (0.00 sec)

mysql> use oldboy
Database changed

mysql> show tables; 
+------------------+
| Tables_in_oldboy |
+------------------+
| student          |
| test             |
+------------------+
2 rows in set (0.00sec)

mysql> select * from test; 
+------+---------+
| id   | name    |
+------+---------+
|  3   | hehe    |
|  5   | kaka    |
|  1   |oldboy   |
|  2   | oldgirl |
|  4   | zuma    |
+------+---------+
5 rows in set (0.00sec)

mysql> quit
Bye

 

2. 在命令行執行備份命令

 

[root@db01 /]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy>/opt/oldboy_$(date +%F).sql
[root@db01 /]# ll /opt/oldboy_2016-08-28.sql
-rw-r--r-- 1 rootroot 2700 Aug 28 23:25 /opt/oldboy_2016-08-28.sql

 

3. 備份完檢查備份完的數據

 

[root@db01 /]# egrep -v '#|\*|--|^$'/opt/oldboy_2016-08-28.sql  
DROP TABLE IF EXISTS`student`;
CREATE TABLE `student`(
  `id` int(4) NOT NULL AUTO_INCREMENT,
---------------------------------
INSERT INTO `test`VALUES (3,'hehe'),(5,'kaka'),(1,'oldboy'),(2,'oldgirl'),(4,'zuma');
UNLOCK TABLES;

提示:根據以上得出的結果,咱們看看到已備份的表結構語句及插入的數據整合的sql語句。

 

(2)範例2:若是出現亂碼指定字符集參數解決備份亂碼問題

 

假如備份數據庫備份文件出現亂碼狀況,用如下參數解決中文亂碼,過程以下

 

1. 查看備份的數據庫客戶端及服務端的字符集設置

 

[root@db01 opt]#mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "show variableslike '%character%'"
+--------------------------+--------------------------------------------+
| Variable_name            |Value                                       |
+--------------------------+--------------------------------------------+
| character_set_client     | utf8                                       |
|character_set_connection  | utf8                                       |
|character_set_database    | utf8                                       |
| character_set_filesystem | binary                                     |
|character_set_results     | utf8                                       |
|character_set_server      | utf8                                       |
|character_set_system      | utf8                                       |
|character_sets_dir        | /application/mysql-5.5.49/share/charsets/  |
+--------------------------+--------------------------------------------+

 

2. 指定對應的字符集備份,這裏爲--default-character_set=utf8 (指定字符集參數)

 

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock - oldboy>/opt/oldboy_$(date +%F).sql

 

執行結果:

 

[root@db01 opt]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy >/opt/oldboy_$(date +%F).sql  
[root@db01 opt]# egrep -v '#|\*|--|^$' /opt/oldboy_2016-08-28.sql

 

提示:若是出現亂碼狀況,使用指定支付及查看,就不會在亂碼了,其實,即便導出的中文亂碼也不要緊,導入數據庫依然是正常的。

 

(3)範例2::利用上述備份好的文件進行數據恢復測試

 

[root@db01 opt]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock oldboy < /opt/oldboy_2016-08-28.sql
[root@db01 opt]#mysql-uroot -poldboy123 -S /data/3306/mysql.sock -e "select * fromoldboy.test;"
+--------+-----------+
| id     | name      |
+--------+-----------+
|  3     | hehe      |
|  5     | kaka      |
|  1     | oldboy    |
|  2     | oldgirl   |
|  4     | zuma      |                 
+--------+-----------+

 

(4)範例4:備份時加-B參數以及使用備份文件恢復數據的兩種方法

 

1. 查看不加-B參數備份文件和加-B備份文件區別

 

不加-B參數備份命令:

 

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy>/opt/oldboy_$(date +%F).sql

 

加-B參數備份命令:

 

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock  oldboy >/opt/oldboy_B_$(date +%F).sql

 

使用vimdiff命令比較不加-B參數配置文件和加-B參數配置文件區別

 

[root@db01 /]# cd /opt/
[root@db01 opt]# vimdiff oldboy_2016-08-28.sql oldboy_B_2016-08-28.sql
-- Current Database: `oldboy`                   
--                                              

                                 
--

# 結論:

直觀看,加上-B參數的做用是增長建立數據庫核鏈接數據庫的語句了,咱們使用-B的備份文件就能夠直接恢復,而不適用-B的備份文件還須要先建立庫才能夠,區別即以下兩條語句:

 

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oldboy`
USE `oldboy`;

 

第一種恢復數據(不加-B參數的備份數據護膚數據)

 

[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock 
mysql> show databases;  
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| mysql               |
| oldboy              |
| performance_schema  |
+---------------------+
6 rows in set (0.00sec)

mysql> drop database oldboy; 
Query OK, 2 rowsaffected (0.11 sec)
 
mysql> show databases; 
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| performance_schema   |
+----------------------+
5 rows in set (0.00sec)

mysql> quit 
Bye

[root@db01 opt]# 
                                   
[root@db01 opt]#

  說明:如今使用沒有帶-B參數備份的備份文件來恢復數據庫,在上面已經跟加-B參數的備份文件作了對比,-B參數備份文件中比不帶-B參數備份的文件多了建立oldboy數據庫核進入oldbou數據庫,就是說-B參數的備份文件爲咱們節省了建立庫和進入庫的兩個步驟,直接將備份文件導入數據庫便可,還不用指定那個庫,由於裏面指定了使oldboy數據庫。

 

第二種備份文件恢復數據(使用加-B參數備份文件恢復)

 

[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "dropdatabase oldboy;"
                                  
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;"     
+---------------------+           
| Database            |
+---------------------+
| information_schema  |
| mysql               |                  
| performance_schema  |
+---------------------+
[root@db01 opt]#  
                                 
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;"         
+---------------------+         
| Database            |
+---------------------+
| information_schema  |
| mysql               |
|               |         
| performance_schema  |
+---------------------+

  # 說明:在上面已經將加-B參數備份的配置文件和不加-B參數備份的配置文件進行對比和說明,加上-B參數在恢復數據時會自動建庫並恢復數據,不加-B則還得先手動建庫,因此這是加-B參數的好處,若是說詳見一個數據庫的數據拷貝到另外一個庫裏能夠不加-B參數,到時候直接將備份文件導入到該庫便可。

 

提示:-B不只只有自動建庫use庫的一鍵恢復庫數據的應用,還能夠指定多個庫

 

(5)範例5:優化備份文件大小減小輸出註釋(debug調試)

 

利用mysqldump的—compact參數優化下備份結果:

 

[root@db01 opt]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy 
    -----------------------

 

帶--compact參數備份

 

mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock -B oldboy --compact >/opt/oldboy_$(date +%F).sql
                    
egrep -v '#|\*|--|^$' /opt/oldboy_2016-08-28.sql

 

--compact參數說明:

wKiom1ftNxiAVy5mAAFAmtt_tDg385.png

注意:--compact此參數不在生產環境使用,用於調試便可。

 

(6)範例6:指定壓縮命令壓縮備份的MySQL數據

在將數據庫數據備份時經過gzip命令壓縮,以節省磁盤空間

 

 mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -B oldboy|>/opt/oldboy_$(date +%F).sql.
[root@db01 opt]# ll /opt/
total 24
-rw-r--r--  1root root 2700 Aug28 23:25 oldboy_2016-08-28.sql
-rw-r--r--  1root root  897 Aug 29 01:55 oldboy_2016-08-29.sql.gz
-rw-r--r--  1root root 2843 Aug28 23:54 oldboy_B_2016-08-28.sql

 

以上例子小結:

1. 備份數據使用-B參數,會在備份數據中增長建庫及use庫的語句。

2. 備份數據使用-B參數,使得後面能夠直接接多個庫名。

3. 備份數據使用gzip對備份的數據壓縮,能夠節省磁盤空間。

4. debug時能夠用—compact減小輸出,但不用於生產。

5. 指定字符集備份用–default-character-set=字符集(通常不適用)

2.1 mysqldump的工做原理

    利用mysqldump命令備份數據的過程,實際上就是把數據從mysql庫裏以邏輯的sql語句的形式直接輸出或者生成備份的文件的過程。

    能否觸類旁通,利用這個備份文件恢復的時候的原理?

    備份的數據過濾掉註釋,都是SQL語句,結果以下:

 

[root@db01 opt]# egrep -v '#|\*|--|^$'/opt/oldboy_2016-08-28.sql
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(4)NOT NULL AUTO_INCREMENT,
  `name`char(20) NOT NULL,
  `age` tinyint(2)NOT NULL DEFAULT '0',
  `dept`varchar(16) DEFAULT NULL,
  PRIMARY KEY(`id`),
  KEY`index_name` (`name`),
  KEY`index_name_dept` (`name`,`dept`),
  KEY`index_123` (`name`,`dept`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOCK TABLES `student` WRITE;
UNLOCK TABLES;
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(4)NOT NULL AUTO_INCREMENT,
  `name`char(20) NOT NULL,
  PRIMARY KEY(`id`),
  KEY`index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULTCHARSET=utf8;
LOCK TABLES `test` WRITE;
INSERT INTO `test` VALUES(3,'hehe'),(5,'kaka'),(1,'oldboy'),(2,'oldgirl'),(4,'zuma');
UNLOCK TABLES;

.3. 數據庫備份實踐

3.1 備份多個庫

1. 查看當前有幾個庫

 

[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock 
mysql> show databases; 
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| 3ooo                 |
| mysql                |
| oldboy               |                #<== 備份
| oldboy_gbk           |                #<== 備份
| performance_schema   | 
+----------------------+
6 rows in set (0.00 sec)

 

開始使用-B參數備份多個庫

 

 mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock  oldboy_gbkoldboy >/opt/bak_$(date +%F).sql.gz
             
 egrep -v '#|\*|--|^$'/opt/bak_2016-08-29.sql.gz

-B參數說明:該參數用於導出若干個數據庫,在備份結果中會加入CREATE DATABASE `db_name`和USE db `db_name`兩個mysql數據庫命令,-B後的參數都將被做爲數據庫名,該參數比較經常使用,當-B後的數據庫列全時,用-A參數,-A參數意思是轉儲全部數據中的全部表。

3.2 分庫備份

    分庫備份實際上就是執行一個備份語句備份一個庫,若是數據庫裏面有多個表,就執行多條相同的備份單個庫的備份語句就能夠備份多個庫了,注意每一個庫均可以對應備份的庫做爲庫名,結尾加sql,

    分庫意義: 舉例,有時一個企業數據庫裏會有多個庫,例如(www,bbs,blog),可是出問題時候的極可能是某一個庫,若是在備份時把全部的庫都備份成一個數據文件的話,恢復某一個庫的數據時就比較麻煩了。

 

方法1:使用一條一條的命令備份:

 

mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy>/opt/………
mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock -B oldboy_gbk >/opt/........

方法二:利用命令拼接實現分庫備份

 

[root@db01 ~]# mkdir /server/backup        
[root@db01 ~]#        
[root@db01 ~]# ls /server/backup/                   
3ooo_2016-08-29.sql.gz  oldboy_2016-08-29.sql.gz  oldboy_gbk_2016-08-29.sql.gz

3.3 備份單表及分表備份

  • 單標備份命令語法:mysqldump-u用戶名 -p密碼 數據庫名 表名> 備份的文件名

 

(1)備份單個表:如下備份oldboy數據庫的test表爲例

 

1. 備份前查看oldboy數據庫有那些表

 

[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;"        
+-----------------+
| Tables_in_oldboy|
+-----------------+
| student         |
| test            |
+-----------------+

 

2. 開始備份單個表(test)表

 

[root@db01 ~]#  
                     
[root@db01 ~]# egrep -v '#|\*|--|^$'/opt/tables.sql          
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(4)NOT NULL AUTO_INCREMENT,
  `name`char(20) NOT NULL,
  `age`tinyint(2) NOT NULL DEFAULT '0',
  `dept`varchar(16) DEFAULT NULL,
  PRIMARY KEY(`id`),
  KEY`index_name` (`name`),
  KEY`index_name_dept` (`name`,`dept`),
  KEY`index_123` (`name`,`dept`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LOCK TABLES `student` WRITE;
UNLOCK TABLES;

 

(2)一條命令分表備份:

 

數據庫分表備份其實就是一條一條的備份,可是又時候一條命令一條命令麻煩,可使用一條命令將多個數據庫表備份,這樣更簡潔,如下將student和test表備份使用一條命令,具體命令以下:

 

[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;"                             #<== 備份前查看當前oldboy數據庫中有哪些表
+------------------+
| Tables_in_oldboy |
+------------------+
| student          |
| test             |
+------------------+

-
[root@db01 ~]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show tables from oldboy;"|egrep -v"Tables_in_oldboy"|sed -r 's#(.*)#mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy \1 >/opt/\1_tables.sql #g'          
mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboystudent >/opt/student_tables.sql
mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test >/opt/test_tables.sql
 
[root@db01 ~]#   
 
[root@db01 ~]# ll -rt /opt/|tail -2                      
-rw-r--r--  1root root 2010 Aug 29 12:18 student_tables.sql
-rw-r--r--  1root root 1941 Aug 29 12:18 test_tables.sql

 

分表備份的缺點

 1.被一個完整全被,在作一個分庫分表備份。

 2. 腳本批量恢復SQL文件

 

面試題:多個庫或者多個表備份到一塊,如何恢復單個庫或者表?

解答:

 a. 第三方測試庫,導入到庫裏,而後把須要的備份出來,最後恢復到正式庫裏。

 b. 單表:grep 表名 bak.sql> 表名.sql

 單庫:循環過濾庫裏全部表,grep表名 bak.ssql > 表名.sql(多個表數據)

 c. 實現分庫分表備份。

3.4 備份多個表

如下備份oldboy數據庫的多個表

1.查看oldboy數據庫中的表,命令以下:

mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showtables from oldboy;"

2. 備份oldboy數據庫中的student、test兩個表,命令以下

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock  >/opt/tables.sql

說明:備份多個表時在oldboy數據庫後面指定多個表便可,不須要加-B參數!

3.5 備份數據庫表結構(不包含數據)

  • 命令語法:mysqldump -u用戶 -p密碼數據庫名 表名 -d > 備份文件名

 

利用mysqldump –d參數值備份數據庫裏面的表結構,

(1)備份oldboy庫的全部表的結構:

  1. 備份前輸出且過檢查

[root@db01 3306]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboytest -d –compact     ,
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
  `id` int(4)NOT NULL AUTO_INCREMENT,
  `name`char(20) NOT NULL,
  PRIMARY KEY(`id`),
  KEY`index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULTCHARSET=utf8;
/*!40101 SET character_set_client =@saved_cs_client */;

 

2.. 以上輸出正確後將其輸出到備份文件中進行備份(備份所有表結果),命令以下

 

mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy -d>/opt/bak_oldboy.sql

3.6 備份表中數據

  • 命令語法:mysqldump-u用戶 -p密碼數據庫名 表名 -t > 備份文件名

 

1. 備份oldboy庫中test表前輸出查看數據是否想要的

 

[root@db01 3306]# mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test -t --compact
INSERT INTO `test` VALUES(3,'hehe'),(5,'kaka'),(1,'oldboy'),(2,'oldgirl'),(4,'zuma');

 

2. 以上結果正確開始備份

 

mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test  >/opt/bak_test.sql

 

使用--tab參數備份的表結構和數據分離

 

[root@db01 3306]# mysqldump-uroot -poldboy123 -S /data/3306/mysql.sock oldboy test --compact 
[root@db01 3306]# ls /tmp/
a.txt b.txt

說明:經過以上的分離後,數據表和sql語句就分開備份了,一個是文本一個是sql語句

 

3.7 小結

  • -B備份多個庫(並添加create和use庫的語句)。

  • -d值備份庫表結構。

  • -t只備份數據(sql語句形式)。

  • -T分離庫表和數據成不一樣的文件,數據是文本,非SQL語句。

 

3.8 刷新binlog的參數

binlog是什麼?是記錄數據庫更新的SQL語句。二進制文件

mysqldump用於定時對某一時刻的數據的全備,例如:00點進行bak.sql.gz

增量備份,當有數據寫入到數據庫時,還會同時更新的·SQL語句寫入到對應的文件裏。這個文件就叫作binlog文件。

 

例如10點丟失數據須要恢復數據

1. 00點時刻備份的bak.sql.gz數據還原到數據庫,這個時候數據恢復到了00點。

2. 00點到10::00數據,就要從binlog裏恢復

    binglog文件生效須要一個參數:log-bin

 

我的理解:咱們平時對數據庫進行備份時定時備份,而不是實時備份數據,假設咱們數據庫北田在晚上00點備份,而我早上8點數據庫出現故障致使數據丟失時,咱們怎麼去找回00點到8點這之間的數據呢?那就要經過binlog文件啦,而binlog文件會切割的,可是在瓦上備份00點前咱們是不須要的,因此在備份時要進行刷險binlog文件,從新生成,就是說從新生成的binlog是00-8:00之間的咱們須要,須要靠這之間的binlog去恢復數據,

 

備份刷新binlog是binlog從新生成須要使用-F參數,生成新的binlog文件

 

下面測試:

 

[root@db01 3306]#ll /data/3306/          
-rw-rw---- 1 mysqlmysql 2547 Aug 28 15:11 mysql-bin.000001
-rw-rw---- 1 mysqlmysql 6282 Aug 29 01:15 mysql-bin.000002
 
[root@db01 3306]#mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock oldboy test >/opt/bak_test.sql  
                                         
 
[root@db01 3306]#ll /data/3306/          
-rw-rw---- 1 mysqlmysql 2547 Aug 28 15:11 mysql-bin.000001
-rw-rw---- 1 mysqlmysql 6282 Aug 29 01:15 mysql-bin.000002
-rw-rw---- 1 mysqlmysql  150 Aug 29 15:47 mysql-bin.000003

 

binlog日誌切割,肯定全備和增量備份的臨界點。

-F刷新binlog日誌,生成新文件,未來增量恢復從這個文件開始,

 

--master-data參數說明:

--master-data在備份文件裏面會添加CHANGEMASTER語句及binlog文件及位置點信息。

wKiom1ftPe_QqVBpAAD1aw5yd_s343.png

 

1. 使用-master-data參數備份範例,值爲1:爲可執行的CHANGEMASTER語句

 mysqldump -uroot -poldboy123 -S/data/3306/mysql.sock oldboy test >/opt/bak_test.sql 
                               #<== 使用--master-data=1參數進行備份
[root@db01 3306]# cat /opt/bak_test.sql         #<== 看下使用該參數真假的說明內容
CHANGE MASTER TO MASTER_LOG_FILE='',MASTER_LOG_POS=

# 以上是使用--master-data=1參數增長的內容,實惠執行的,此內容會顯示出binlog文件從那個開始切割,並且還有從文件裏面的第幾行開始

 

2. 使用-master-data參數備份範例,值爲2:註釋的--CHANGEMASTER語句。

 

[root@db01 3306]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sockoldboy test -F --master-data=2 >/opt/bak_test.sql     
[root@db01 3306]# cat /opt/bak_test.sql     
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS=107;

# 以上結果代表值爲1和2是不同的,值爲1的是可執行的,值爲2的則是註釋的

 

說明:通常-master-data=1時用於作從庫,想inotify和backup差很少,若是是單純的增量恢復只須要-master-data=2便可。

 

--master-data除啦增量恢復肯定臨界點外,作主從複製是做用更大

 

3.9 mysqldump的關鍵參數說明

參數

解釋說明

–B

指定多個庫,增長建庫語句和use語句,  *****

--compact

去掉註釋,適合調試輸出,生產不適用

-A

備份全部庫

-F

刷新binlog日誌,生成新文件,未來增量恢復從這個文件開始

--master-data

增長binlog日誌文件名及對應的位置點(及CHANGE MASTER語句)。

--master-data=1不註釋;--master-data=2註釋;

--evebts

備份全部,若是想備份數據庫中mysql庫就要求使用此參數

-R

備份存儲過程

-d

只備份庫表結構,無數據。

-t

只備份數據,無庫表結構,SQL語句形式。

-T  --tab=name

庫表和數據分離不一樣文件,數據是文本形式。

-x

鎖表,在某一時刻不能往裏面更新數據,因此備份要當心。

-l –lock-tables

只讀鎖表

--single-transaction

適合innodb食物數據庫備份

innodb表在備份時,一般啓用選項—single-transaction來保證備份的一致性,實際上他的工做原理是設定本次會話的隔離級別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其餘會話已經提交了的數據。

-q  --quick

不作緩存查詢查詢,直接導到標準輸出,加快備份速度

wKioL1ftP0mApiHUAADIdJOD8Ko578.png

wKiom1ftP4Wy52TeAAD1aw5yd_s711.png

更多參數:mysqdump –help

 

4. 生產場景不一樣引擎mysqldump備份命令

 

myisam引擎企業生產備份命令(適合全部引擎或混合殷勤)

mysqldump -uroot -poldboy123 -A -B -F -R--master-data=2 -x --events|gzip >/opt/alL__$(date +%F).sql.sql.gz

# -F也能夠不用,與—master-data有些重複

 

innodb引擎企業生產備份命令(推薦使用的)

 

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

# -F也能夠不用,與—master-data有些重複

 

額外補充:

(1)mysqldump是邏輯備份說明

缺點:效率不是很高。

優勢:簡單,方便。可靠,遷移。

適合於數量不是很特別大的場景,打包前50G之內數據。

 

(2)若是超過50G可選方案以下:

1. xtrabackup物理備份工具,全備和增量。

2. 物理備份方案,從庫中止SQL線程,打包,cp。

 

3)何時會使用備份的數據?

1. 恢復數據到測試庫的時候。

2. 人爲經過SQL語句將數據刪除的時候。

3. 作主從複製的時候。

 

5. 恢復數據庫實踐

5.1 數據庫恢復事項

提示:

1. 數據恢復和字符集關聯很大,若是字符集不正確戶致使恢復的數據亂碼,

2.  mysql命令以及source命令恢復數據庫的原理就是把文件的SQL語句,在數據庫裏從新執行的過程。

 

5.2 利用source命令恢復數據庫

 

進入mysql數據庫控制檯,mysql –uroot –p登錄後

mysql> use 數據庫

而後使用source命令,後面參數爲腳本文件(如這裏用到的sql)。

mysql> source oldboy_db.sql  #這個文件是系統路徑,默認是登陸mysql前的系統路徑。

 

source實踐操做以下:

 

[root@db01 3306]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock 
mysql> show databases;          
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| oldboy               |
| performance_schema   |
+----------------------+
4 rows in set (0.00 sec)
 
mysql> drop database oldboy;  
Query OK, 2 rows affected (0.00 sec

mysql> show databases;  
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| performance_schema   |
+----------------------+
3 rows in set (0.00 sec)
 
mysql>       
Query OK, 0 rows affected (0.00 sec)
------如下內容輸出省略---------

mysql> show databases;                         
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| oldboy               |
| performance_schema   |
+----------------------+
4 rows in set (0.00 sec)

 

 

5.3 利用mysql命令恢復(標準)

  • 命令語法:

mysql -u用戶 -p密碼 -S /data/3306/mysql.sock 數據庫<備份文件

 

提示:此命令分爲兩種方式恢復。取決於備份文件備份時是否指定-B參數進行備份

 

第一種恢復數據(不加-B參數的備份數據護膚數據)

 

[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock 
mysql> show databases;  
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| mysql                |
| oldboy               |
| performance_schema   |
+----------------------+
6 rows in set (0.00sec)

mysql> drop database oldboy;        
Query OK, 2 rowsaffected (0.11 sec)
 
mysql> show databases;              
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| mysql               |
| performance_schema  |
+---------------------+
5 rows in set (0.00sec)

[root@db01 opt]# 
              #<== 先建立oldboy數據庫
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock oldboy</opt/oldboy_2016-08-28.sql

 

第二種備份文件恢復數據(使用加-B參數備份文件恢復)

 

[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "dropdatabase oldboy;"
                                           
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;"     
+---------------------+                    
| Database            |
+---------------------+
| information_schema  |
| mysql               |                  
| performance_schema  |
+---------------------+
[root@db01 opt]# 
                     
[root@db01 opt]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;"         
+---------------------+          | Database            |
+---------------------+
| information_schema  |
| mysql               |
           |
| performance_schema  |
+---------------------+

   # 說明:在上面已經將加-B參數備份的配置文件和不加-B參數備份的配置文件進行對比和說明,加上-B參數在恢復數據時會自動建庫並恢復數據,不加-B則還得先手動建庫,因此這是加-B參數的好處,若是說詳見一個數據庫的數據拷貝到另外一個庫裏能夠不加-B參數,到時候直接將備份文件導入到該庫便可。

  若是在導出時指定-B參數,恢復時無需指定庫恢復,爲何?

  由於使用-B參數導出數據時自帶了useoldboy和create database oldboy;而恢復時指定相似於use oldboy;

 

提示:-B不只只有自動建庫use庫的一鍵恢復庫數據的應用,還能夠指定多個庫

5.4 針對壓縮的備份文件恢復數據

方法1:

 

cd /opt/
gzip bak_2016-08-29.sql.gz           
mysql -uroot -poldboy123 -S /data/3306/mysql.sock</opt/bak_2016-08-29.sql

 

方法2:

wKioL1ftQ66DnLoDAABiwmih5Wk672.png

 

6. 實現和mysql非交互式對話

6.1 利用mysql –e 參數查看mysql數據庫

使用-e參數在命令行查看有哪些數據庫

 

[root@db01 /]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "showdatabases;"
+----------------------+
| Database             |
+----------------------+
| information_schema   |
| 3ooo                 |
| mysql                |
| oldboy               |
| oldboy_gbk           |
| performance_schema   |
+----------------------+

 

使用-e參數在命令行執行多條mysql數據命令

 

[root@db01 /]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "use oldboy; select * from oldboy.test;"        
+----+----------+
| id   name     |
+----+----------+
|  3 | hehe     |
|  5 | kaka     |
|  1 | oldboy   |
|  2 | oldgirl  |
|  4 | zuma     |
+----+----------+

 

利用mysql –e參數查看SQL線程執行狀態

 

[root@db01 /]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show processlist;"   
+-----+-----+----------+------+---------+--------+--------+------------------+
| Id  | User|Host      | db   | Command |Time    | State  | Info             |
+-----+-----+----------+------+---------+--------+--------+------------------+
| 30  | root|localhost | NULL | Query   |   0    | NULL   | showprocesslist  |
+-----+-----+----------+------+---------+--------+--------+------------------+

 

查看完整的線程狀態,此參數才查看滿語句是很是有用

 

[root@db01 /]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show full processlist;"
+-----+-----+----------+------+----------+--------+--------+------------------------+
| Id  | User|Host      | db   | Command  |Time    | State  | Info                   |
+-----+-----+----------+------+----------+--------+--------+------------------------+
| 30  | root|localhost | NULL | Query    |   0    | NULL   | showfull processlist   |
+-----+-----+----------+------+----------+--------+--------+------------------------+

 

企業案例:mysql sleep 線程過多的問題案例

mysql> show full processlist;
+-----+-----+----------+------+----------+--------+--------+------------------------+
| Id  | User|Host      | db   | Command  |Time    | State  | Info                   |
+-----+-----+----------+------+----------+--------+--------+------------------------+
| 30  | root|localhost | NULL | Query    |   0    | NULL   | showfull processlist   |
+-----+-----+----------+------+----------+--------+--------+------------------------+
1 row in set (0.00 sec)

 

1. 解決方法:配置文件裏修改

[mysqld]

interactive_timeout = 120           #<== 超時時間;此參數設置後wait_timeout自動生效。

wait_timeout = 120                           #<== 超時時間

2. 其餘解決方法:

  PHP程序中,不使用持久連接,及使用mysql_connect而不是pconnect(JAVA調整鏈接池)

3. PHP程序執行完畢,應該顯示調用mysql_close。

4. 逐步分析MySQL的SQL查詢及慢查詢日誌,找到查詢國漫的SQL優化之。

 

6.2 利用mysql -e參數查看mysql變量及性能狀態

使用命令show variables能夠查看相關參數是否在數據庫中生效

# 查看mysql數據庫中全部的變量

 

[root@db01 /]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show variables;"
| Variable_name(變量名稱)          | Value (值的意思)                   |
+------------------------------------+--------------------------------------+
|auto_increment_increment            |       1                              |
| auto_increment_offset              |       1                              |
| autocommit                         |       ON                             |
| automatic_sp_privileges            |       ON                             |
-------------------------如下內容省略-----------------------

 

如今想查看mysql中的server_id,以下:

 

[root@db01/]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show variables ;」
       
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

查看下binlog是否開啓
[root@db01 /]# mysql -uroot -poldboy123 -S/data/3306/mysql.sock -e "show variables ';"
       
+---------------------------------+---------+
| Variable_name                   |Value    |
+---------------------------------+---------+
| log_bin                         | ON      |
| log_bin_trust_function_creators | OFF     |
| sql_log_bin                     | ON      |
+---------------------------------+---------+

 

6.3 不重啓數據庫修改數據庫參數

不重啓數據庫修改數據庫參數,可是要求重啓後還能生效。

 

[root@db01 /]#mysql -uroot -poldboy123 -S /data/3306/mysql.sock
mysql> showvariables like '%key_buffer%';           
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| key_buffer_size   |16777216  |                    
+-------------------+----------+
1 row in set (0.00 sec)

mysql>    
Query OK, 0 rows affected (0.07 sec)
 
mysql> show variables like '%key_buffer%';              
+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| key_buffer_size  |33554432  |                      
+------------------+----------+
1 row in set (0.00 sec)

 

不重啓數據庫更改數據庫參數小結:

1. set global key_buffer_size = 1024*1024*32;   #<== 臨時生效,重啓失效

2. 配置文件也要改,編輯/etc/my.cnf,修改key_buffer_size = 32k

 

6.4 生產場景經常使用重要命令小結

show processlist;         #<== 查看數據庫里正在執行的SQL語句,可能沒法查看完整的SQL語句

show full processlist;      #<== 查看正在執行的完整SQL語句,完整顯示(組好使用-e外面看)

set global key_buffer_size = 1024*1024*32;  #<== 不重啓數據庫調整數據庫參數,直接生效,重啓後失效

show variables;                    #<== 查看數據庫的配置參數信息,例如:my.cnf裏參數的生效狀況

                                  例如:show variables like '%log_bin';

kill ID;                   #<== 殺掉SQL線程的命令,ID爲線程號

show session status;          #<== 查看當前會話的數據庫狀態信息

show global status;         #<== 查看整個數據庫運行狀態信息,很重要,要分析並作好監控

show engine innodb status;       #<== 顯示innodb引擎的性能狀態(早期版本show innodb status)

 

計算一天以內,MySQL數據庫有多個insert,delete,有沒有好方法?

   1.定時天天0點,show global status 按天取出對比。

   2.按天分析binlog日誌,獲取數據庫不一樣語句的頻率。

 

mysql經常使用命令參數:

-u:用戶

-p:密碼

-S:指定socket

-h:主機

-P:端口

-e:命令行執行數據庫命令

 

7. mysqladmin命令

mysqladmin的相關命令

mysqladmin password 123456                 #<== 數據庫無密碼設置密碼

mysqladmin -uroot -p123456 password 123123      #<== 修改密碼

mysqladmin -uroot -p123456 status            #<== 查看狀態

mysqladmin -uroot -p123456 extended-status      #<== 相似show global status,查看狀態信息

mysqladmin -uroot -p123456 -S /data/3306/mysql.sock -i 1 status  #<== 每隔1秒查看一次

mysqladmin -uroot -p123456 flush-logs        #<== 刷新binlog日誌

mysqladmin -uroot -p123456 processlist          #<== 查看MySQL數據庫進程

mysqladmin -uroot -p123456 processlist -i 1      #<== 實時跟蹤進程列表(抓慢查詢)

which mysqladmin -uroot -p123456 processlist      #<== 實時查詢進程列表

mysqladmin -uroot -p123456 -S /data/3306/mysql.sockstutdown    #<== 關機

mysqladmin -uroot -p123456 -S /data/3306/mysql.sockvariables   #<== 查看

相關文章
相關標籤/搜索