MySQL運維之---mysqldump備份、select...into outfile、mysql -e 等工具的使用


1、mysqldump備份一個數據庫

mysqldump命令備份一個數據庫的基本語法:

mysqldump  -u user -p pwd  dbname > Backup.sql

我們來講解一下備份的文件都包含了什么?-- MySQL dump 10.13 Distrib 5.5.20, for Win32 (x86)--

-- Host: 127.0.0.1 Database: school -- ------------------------------------------------------ -- Server version 5.5.20-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 */; -- -- Table structure for table `book` -- DROP TABLE IF EXISTS `book`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `book` ( `bookid` int(11) NOT NULL, `bookname` varchar(255) NOT NULL, `authors` varchar(255) NOT NULL, `info` varchar(255) DEFAULT NULL, `comment` varchar(255) DEFAULT NULL, `year_publication` year(4) NOT NULL, KEY `BkNameIdx` (`bookname`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `book` -- LOCK TABLES `book` WRITE; /*!40000 ALTER TABLE `book` DISABLE KEYS */; INSERT INTO `book` VALUES (1,'鍓戝湥','灝忔槑','13','hao',2013); /*!40000 ALTER TABLE `book` 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 2014-07-23 22:04:16

我們看到文件中以“ - ”開頭的都表示注釋。以“ /*! ”開頭,“ */ ”結尾的語句為MYSQL可以執行的注釋。旨在說明mysql具有可移植性。

備份文件的上半部分的一些SET語句,這些語句將一些系統變量值賦給用戶定義變量,目的是確保被恢復的數據庫的系統變量和原來備份時的變量相同。

備份文件的最后幾行MYSQL使用SET語句恢復服務器系統變量原來的值。

還有一點需要注意:備份文件中的MYSQL可執行注釋語句,以“40101”數字開頭的,這些數字代表了MYSQL版本號,告訴我們,這些語句只有在制定的MYSQL版本或者比該版本高的情況下才能執行。40101代表版本:4.01.01版本。

2、備份一個數據庫中的某個表

mysqldump  -u user  -p pwd dbname table1 table2  table3... >  Backup.sql

備份多個數據庫

mysqldump  -u root -p pwd  --databases dbname1  dbname2  dbname3  .... > Backup.sql

備份MYSQL中全部的數據庫

mysqldump  -u root -p pwd  --all-databases > Backup.sql

3、mysqldump命令的簡單使用(這里注重簡單快速上手的使用,如果想看詳細的使用方法,可以繼續往下拉)

--add-drop-database         每個數據庫創建語句前面加上DROP DATABASE語句
--add-drop-table            每個表創建語句前面加上DROP TABLE語句

默認情況下,這兩個參數命令會自動加上,因此你需要注意的是:導入前一定要確認好舊數據庫的確可以刪除,因為備份文檔里面包含了刪除舊的數據庫和舊的表的刪除語句,因此導入前要仔細檢查這一點。

-n,--no-create-db          不包含數據庫的創建語句
-t,--no-create-info        不包含表的創建語句
-d,--no-data               不包含數據

這三個語句默認是不加上的,因此備份的時候需要根據自己的需求來進行選擇。

4、使用mysqldump命令導出為類似csv文本格式的數據

記住關鍵參數-T:

~]# mysqldump -u username -T target_dir dbname tablename [option]

-T target_dir                    備份表和數據至目標目錄下
--fields-terminated-by=name           字段分隔符
--fields-enclosed-by=name            字段引用符
--fields-optionally-enclosed-by=name     字段引用符(只在CHAR、VARCHAR、TEXT等字符型字段上使用)
--fields-escaped-by=name            轉移字符
--lines-terminated-ny=name           記錄結束符

 當你備份至指定目錄完成后,你會發現指定目錄下面有兩個文件,一個是sql文件,一個是txt文件。

案例演示:

[tidb@:vg_adn_tidbCkhsTest /tmp/bak]$mysqldump -uroot -p123456 mob_adn test -T /tmp/ --fields-terminated-by '\t' --fields-optionally-enclosed-by '"'
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[tidb@:vg_adn_tidbCkhsTest /tmp/bak]$ls
test.sql  test.txt
[tidb@:vg_adn_tidbCkhsTest /tmp/bak]$cat test.txt 312 "0" 2 0 "com.apps.noise.detector" "GB" 5 0 0 0 4 401 "{\"value\":\"Noise Detector\"}" "1160dbc70324001ddf709052280e2de6" 2 11 "" 1 162035357 2047421827 1499358006 1501237112 "" "" ""

 

 sql文件主要是建表語句而已:

-- MySQL dump 10.13  Distrib 5.7.24, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: mob_adn
-- ------------------------------------------------------
-- Server version       5.7.24-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 */;--
-- Table structure for table `test`
--
DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
......
......
......

 

 mysqldump實際調用的就是select....into  outfile...的接口而已,並在其上添加了新的功能。

如果我們要導入這樣的txt格式的文件,我們可以使用mysqlimport命令或者load data infile的方法。參考下節內容

5、使用SELECT.......INTO  OUTFILE導出文本文件

該文件被創建在服務器主機上,因此必須有文件寫入權限(FILE權限),才能使用此語法

語法:

select columnlist  from Table WHERE condition  into outfile 'filename' [OPTIONS]
fields terminated by 'VALUE' fields [OPTIONALLY] ENCLOSED BY 'VALUE' fields ESCAPED BY 'VALUE' lines STARTING by 'VALUE' lines terminated by 'VALUE'

[OPTIONS]部分為可選參數,[OPTIONS]部分的語法包括FILED和LINES子句,其可能取值為:

● fields子句:在FIELDS子句中有三個子句:TERMINATED BY、 [OPTIONALLY] ENCLOSED BY和ESCAPED BY。

如果指定了FIELDS子句,則這三個子句中至少要指定一個。
(1)TERMINATED BY用來指定字段值之間的符號,例如,“TERMINATED BY ','”指定了逗號作為兩個字段值之間的標志,默認為“\t”制表符。
(2)ENCLOSED BY子句用來指定包裹文件中字符值的符號,例如,“ENCLOSED BY ' " '”表示文件中字符值放在雙引號之間,

若加上關鍵字OPTIONALLY表示所有的值都放在雙引號之間,則只有CHAR和VARCHAR等字符數據字段被包括。

(3)ESCAPED BY子句用來指定轉義字符,例如,“ESCAPED BY '*'”將“*”指定為轉義字符,取代“\”,如空格將表示為“*N”。
● LINES子句:在LINES子句中使用TERMINATED BY指定一行結束的標志,如“LINES TERMINATED BY '?'”表示一行以“?”作為結束標志,默認值為“\n”。

LINES STARTING BY ''表示每行數據開頭的字符,可以為單個或多個,默認不是有任何字符

如果在導出的時候沒有制定OPTIONS的參數,導入表的時候也不用指明這些參數。

注意:這個SELECT命令導出文本文件有限制,就是想要在服務器主機之外的部分客戶主機上創建結果文件,不能使用此參數。應該使用“mysql  -e”命令。(就是我們使用客戶端連接遠程的服務器端的操作,怪不得TIDB數據庫不支持這個命令導出數據)

6、、使用“mysql  -e”命令導出文本文件.

這個就是說我們可以在命令模式下執行SQL指令,將查詢結果導入到一個類似與csv格式的文本文件中。

mysql -u root -p --execute="SELECT * from tablename" dbname >filename.txt

上面的select語句必須使用雙引號引起來。導出的數據使用制表符分割了。

 

7、最后細說講一下mysqldump語法說明:

-h, --host=name
主機名
-P[ port_num], --port=port_num
用於連接MySQL服務器的的TCP/IP端口號

--master-data
這個選項可以把binlog的位置和文件名添加到輸出中,如果等於1,將會打印成一個CHANGE MASTER命令;如果等於2,會加上注釋前綴。並且這個選項會自動打開--lock-all-tables,除非同時設置了--single-transaction(這種情況下,全局讀鎖只會在開始dump的時候加上一小段時間,不要忘了閱讀--single-transaction的部分)。在任何情況下,所有日志中的操作都會發生在導出的准確時刻。這個選項會自動關閉--lock-tables。

-x, --lock-all-tables
鎖定所有庫中所有的表。這是通過在整個dump的過程中持有全局讀鎖來實現的。會自動關閉--single-transaction和--lock-tables。

--single-transaction
通過將導出操作封裝在一個事務內來使得導出的數據是一個一致性快照。只有當表使用支持MVCC的存儲引擎(目前只有InnoDB)時才可以工作;其他引擎不能保證導出是一致的。當導出開啟了--single-transaction選項時,要確保導出文件有效(正確的表數據和二進制日志位置),就要保證沒有其他連接會執行如下語句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,這會導致一致性快照失效。這個選項開啟后會自動關閉--lock-tables。

-l, --lock-tables
對所有表加讀鎖。(默認是打開的,用--skip-lock-tables來關閉,上面的選項會把關閉-l選項)

-F, --flush-logs
在開始導出前刷新服務器的日志文件。注意,如果你一次性導出很多數據庫(使用 -databases=--all-databases選項),導出每個庫時都會觸發日志刷新。例外是當使用了--lock-all-tables或--master-data時:日志只會被刷新一次,那個時候所有表都會被鎖住。所以如果你希望你的導出和日志刷新發生在同一個確定的時刻,你需要使用--lock-all-tables,或者--master-data配合--flush-logs。

--delete-master-logs
備份完成后刪除主庫上的日志。這個選項會自動打開``--master-data`。

--opt-add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys。(默認已開啟,--skip-opt關閉表示這些選項保持它的默認值)應該給你為讀入一個MySQL服務器的盡可能最快的導出,--compact差不多是禁用上面的選項。

-q, --quick
不緩沖查詢,直接導出至stdout。(默認打開,用--skip-quick來關閉)該選項用於轉儲大的表。
--set-charset
將SET NAMES default_character_set加到輸出中。該選項默認啟用。要想禁用SET NAMES語句,使用--skip-set-charset。
--add-drop-tables
在每個CREATE TABLE語句前添加DROP TABLE語句。默認開啟。
--add-locks
在每個表導出之前增加LOCK TABLES並且之后UNLOCK TABLE。(為了使得更快地插入到MySQL)。默認開啟。
--create-option
在CREATE TABLE語句中包括所有MySQL表選項。默認開啟,使用--skip-create-options來關閉。
-e, --extended-insert
使用全新多行INSERT語法,默認開啟(給出更緊縮並且更快的插入語句)

-d, --no-data
不寫入表的任何行信息。如果你只想得到一個表的結構的導出,這是很有用的。

--add-drop-database
在create數據庫之前先DROP DATABASE,默認關閉,所以一般在導入時需要保證數據庫已存在。

--default-character-set=
使用的默認字符集。如果沒有指定,mysqldump使用utf8。

-B, --databases
轉儲幾個數據庫。通常情況,mysqldump將命令行中的第1個名字參量看作數據庫名,后面的名看作表名。使用該選項,它將所有名字參量看作數據庫名。CREATE DATABASE IF NOT EXISTS db_name和USE db_name語句包含在每個新數據庫前的輸出中。

--tables
覆蓋--database選項。選項后面的所有參量被看作表名。

-u[ name], --user=
連接服務器時使用的MySQL用戶名。

-p[password], --password[=password]
連接服務器時使用的密碼。如果你使用短選項形式(-p),不能在選項和密碼之間有一個空格。如果在命令行中,忽略了--password或-p選項后面的 密碼值,將提示你輸入一個。

注意:如果運行mysqldump沒有--quick或--opt選項,mysqldump在轉儲結果前將整個結果集裝入內存,如果轉儲大數據庫可能會出現問題,該選項默認啟用,但可以使用--skip-opt禁用。如果使用最新版本的mysqldump程序備份數據,並用於恢復到比較舊版本的mysql服務器中,則不要使用--opt選項。

備份的時候-F和 -l (小寫字母L)經常配合一起使用,-F表示備份前刷新日志,方便恢復過程。-l選項在備份期間使用,使得數據無法被更新。從而使備份的數據保持一致性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM