方法1、 Create table new_table_nam備份到新表:
MYSQL不支持: Select * Into new_table_name from old_table_name;
替代方法: create table tb2 select c1,c2,c3 from tb1 group by c1,c2,c3;html
方法2、insert into newtable select * from oldtable;mysql
1. 語法介紹
有三張表a、b、c,如今須要從表b和表c中分別查幾個字段的值插入到表a中對應的字段。對於這種狀況,可使用以下的語句來實現:sql
INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name數據庫
上面的語句比較適合兩個表的數據互插,若是多個表就不適應了。對於多個表,能夠先將須要查詢的字段JOIN起來,而後組成一個視圖後再SELECT FROM就能夠了:swift
INSERT INTO a (field1,field2) SELECT * FROM(SELECT b.f1,c.f2 FROM b JOIN c) AS tbwindows
其中f1是表b的字段,f2是表c的字段,經過JOIN查詢就將分別來自表b和表c的字段進行了組合,而後再經過SELECT嵌套查詢插入到表a中,這樣就知足了這個場景了,若是須要不止2個表,那麼能夠多個JOIN的形式來組合字段。緩存
2. 語法錯誤注意
須要注意的是嵌套查詢部分最後必定要有設置表別名,以下:安全
SELECT * FROM (SELECT f1,f2 FROM b JOIN c) AS tb服務器
即最後的AS tb是必須的(tb這個名稱能夠隨意取),即指定一個別名。每一個派生出來的新表都必須指定別名,不然在mysql中會報以下錯誤:oracle
方法3、mysqldump批量導出表結構(數據)到sql:
1.先備份表結構和數據
僅導出結構,不導出數據:
一、導出數據庫為dbname的表結構
mysqldump -h主機地址 -u用戶名 -p密碼 -d dbname >db.sql;
二、導出數據庫為dbname某張表(test)結構
mysqldump -h主機地址 -u用戶名 -p密碼 -d dbname test>db.sql;
導出結構+數據:
三、導出數據庫為dbname全部表結構及表數據(不加-d)
mysqldump -h主機地址 -u用戶名 -p密碼 dbname >db.sql;
四、導出數據庫為dbname某張表(test)結構及表數據(不加-d)
mysqldump -h主機地址 -u用戶名 -p密碼 dbname test>db.sql;
5.導出數據中dbname多張表(test1,test2,test3)結構及表數據用用空格隔開
mysqldump -h主機地址 -u用戶名 -p密碼 dbname test1 test2 test3>db.sql;
方法4、在本地直接導出服務器數據:
mysql DB_name -h10.36.10.11 -utest -p -e "select * from TABLE_name where acti_type <> '無效'; order by acti_date desc" > ./test.txt
-N 便可 -N, --skip-column-names.Don't write column names in results.
方法5、 select into outfile導出到文件:
BACKUP TABLE 語法其實和 mysqlhotcopy 的工做原理差很少,都是鎖表,而後拷貝數據文件。它能實如今線備份,可是效果不理想,所以不推薦使用。它只拷貝表結構文件和數據文件,不一樣時拷貝索引文件,所以恢復時比較慢。
例子:
BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必需要有 FILE 權限才能執行本SQL,而且目錄 /tmp/db_name/ 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以免安全問題。
SELECT INTO OUTFILE 則是把數據導出來成爲普通的文本文件,能夠自定義字段間隔的方式,方便處理這些數據。
例子:
SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必需要有 FILE 權限才能執行本SQL,而且文件 /tmp/db_name/tbl_name.txt 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以免安全問題。
恢復
用 BACKUP TABLE 方法備份出來的文件,能夠運行 RESTORE TABLE 語句來恢復數據表。
例子:
RESTORE TABLE FROM '/tmp/db_name/';
權限要求相似上面所述。
用 SELECT INTO OUTFILE 方法備份出來的文件,能夠運行 LOAD DATA INFILE 語句來恢復數據表。
例子:
LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
權限要求相似上面所述。倒入數據以前,數據表要已經存在才行。若是擔憂數據會發生重複,能夠增長 REPLACE 關鍵字來替換已有記錄或者用 IGNORE 關鍵字來忽略他們。
使用into outfile 和 load data infile導入導出備份數據,這種方法的好處是,導出的數據能夠本身規定格式,而且導出的是純數據,不存在建表信息,你能夠直接導入另一個同數據庫的不一樣表中,相對於mysqldump比較靈活機動。
咱們來看下面的例子:
(1)下面的mysql命令是把select的mytable表中的數據導出到/home/db_bak2012文件。
select * from mytable where status!=0 and name!='' into outfile '/home/db_bak2012'
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;
導入剛纔備份的數據,可使用load file方法,下面的mysql命令,把導出的數據導入了mytable_bak的表中:
load data infile '/home/db_bak2012' into table mytable_bak
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;
select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id desc;
Recent Ubuntu Server Editions (such as 10.04) ship with AppArmor and MySQL's profile might be in enforcing mode by default. You can check this by executing sudo aa-status like so:
> sudo aa-status
5 profiles are loaded. 5 profiles are in enforce mode. /usr/lib/connman/scripts/dhclient-script /sbin/dhclient3 /usr/sbin/tcpdump /usr/lib/NetworkManager/nm-dhcp-client.action /usr/sbin/mysqld 0 profiles are in complain mode. 1 processes have profiles defined. 1 processes are in enforce mode : /usr/sbin/mysqld (1089) 0 processes are in complain mode.
If mysqld is included in enforce mode, then it is the one probably denying the write. Entries would also be written in /var/log/messages when AppArmor blocks the writes/accesses. What you can do is edit /etc/apparmor.d/usr.sbin.mysqld and add /data/ and /data/* near the bottom like so:
/usr/sbin/mysqld { ... /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid w, /var/run/mysqld/mysqld.sock w, /data/ r, /data/* rw, }
And then make AppArmor reload the profiles.
> sudo /etc/init.d/apparmor reload
補充一點,A表數據 複製到B表,B表不能有自增ID
若是有自增ID,則不插入自增
insert into B (title) select title from A
方法6、 把bestlovesky.xls以文本方式打開,而後另存爲,在編碼選擇ansi編碼,保存
echo "select id,name from bestlovesky where 1 order by id desc limit 0, 50;"| /usr/local/mysql/bin/mysql -h127.0.0.1-uroot -p123456 > /data/bestlovesky.xls
默認帶有字段名/列名,不輸出列名使用-N參數。
由於office默認的是gb2312編碼,服務器端生成的頗有多是utf-8編碼,這個時候你有兩種選擇,1.在服務器端使用iconv來進行編碼轉換
格式爲: LOAD DATA INFILE "/path/to/file" INTO TABLE table_name;
LOAD DATA [LOW_PRIORITY CONCURRENT] [LOCAL] INFILE ’file_name.txt’
[REPLACE IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY ’string’]
[[OPTIONALLY] ENCLOSED BY ’char’]
[ESCAPED BY ’char’ ]
]
[LINES
[STARTING BY ’string’]
[TERMINATED BY ’string’]
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = eXPr,...)]
例如:
load data infile '/home/mysql/xxxxxxxxx.csv'
into table `table_name`
character set utf8
fields terminated by '^'
lines terminated by '\n';
注意:若是導出時用到了FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'語句,那麼LODA時也要加上一樣的分隔限制語句。還要注意編碼問題。
fields和lines在前面,(col_name_or_user_var,…)在後面 若是你使用的時候直接把要寫的這些屬性放在表名後面,這樣是不正確的,必定要寫到fields和lines的後面,
方法2、Source 備份表的路徑 如:Source d:/ok_db.sql便可導入sql文件。
經過source命令導入多個文件,能夠新建一個sou.sql文件,裏面存放下面的命令
例如:
source d:/a1.sql;
source d:/a2.sql;
當你運行
這樣就能夠在一個source命令裏面導入多個sql文件了。
MySQL數據庫備份和恢復方法詳解
本文討論 MySQL 的備份和恢復機制,以及如何維護數據表,包括最主要的兩種表類型:MyISAM 和 Innodb,文中設計的 MySQL 版本爲 5.0.22。
目前 MySQL 支持的免費備份工具備:mysqldump、mysqlhotcopy,還能夠用 SQL 語法進行備份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者備份二進制日誌(binlog),還能夠是直接拷貝數據文件和相關的配置文件。MyISAM 表是保存成文件的形式,所以相對比較容易備份,上面提到的幾種方法均可以使用。Innodb 全部的表都保存在同一個數據文件 ibdata1 中(也多是多個文件,或者是獨立的表空間文件),相對來講比較很差備份,免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump。
一、mysqldump
1.1 備份
mysqldump 是採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不一樣的 MySQL 版本之間升級時相對比較合適,這也是最經常使用的備份方法。
如今來說一下 mysqldump 的一些主要參數:
–compatible=name它告訴 mysqldump,導出的數據將和哪一種數據庫或哪一個舊版本的 MySQL 服務器相兼容。值能夠爲 ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個值,用逗號將它們隔開。固然了,它並不保證能徹底兼容,而是儘可能兼容。
–complete-insert,-c導出的數據採用包含字段名的完整 INSERT 方式,也就是把全部的值都寫在一行。這麼作能提升插入效率,可是可能會受到 max_allowed_packet 參數的影響而致使插入失敗。所以,須要謹慎使用該參數,至少我不推薦。
–default-character-set=charset指定導出數據時採用何種字符集,若是數據表不是採用默認的 latin1 字符集的話,那麼導出時必須指定該選項,不然再次導入數據後將產生亂碼問題。
–disable-keys告訴 mysqldump 在 INSERT 語句的開頭和結尾增長 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語句,這能大大提升插入語句的速度,由於它是在插入完全部數據後才重建索引的。該選項只適合 MyISAM 表。
–extended-insert = true|false默認狀況下,mysqldump 開啓 --complete-insert 模式,所以不想用它的的話,就使用本選項,設定它的值爲 false 便可。
–hex-blob使用十六進制格式導出二進制字符串字段。若是有二進制數據就必須使用本選項。影響到的字段類型有 BINARY、VARBINARY、BLOB。
–lock-all-tables,-x在開始導出以前,提交請求鎖定全部數據庫中的全部表,以保證數據的一致性。這是一個全局讀鎖,而且自動關閉 --single-transaction 和 --lock-tables 選項。
–lock-tables它和 --lock-all-tables 相似,不過是鎖定當前導出的數據表,而不是一會兒鎖定所有庫下的表。本選項只適用於 MyISAM 表,若是是 Innodb 表能夠用 --single-transaction 選項。
–no-create-info,-t只導出數據,而不添加 CREATE TABLE 語句。
–no-data,-d不導出任何數據,只導出數據庫表結構。
–opt這只是一個快捷選項,等同於同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqldump 很快的導出數據,而且導出的數據能很快導回。該選項默認開啓,但能夠用 --skip-opt 禁用。注意,若是運行 mysqldump 沒有指定 --quick 或 --opt 選項,則會將整個結果集放在內存中。若是導出大數據庫的話可能會出現問題。
–quick,-q該選項在導出大表時頗有用,它強制 mysqldump 從服務器查詢取得記錄直接輸出而不是取得全部記錄後將它們緩存到內存中。
–routines,-R導出存儲過程以及自定義函數。
–single-transaction該選項在導出數據以前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於事務表,例如 InnoDB 和BDB。
本選項和 --lock-tables 選項是互斥的,由於 LOCK TABLES 會使任何掛起的事務隱含提交。
要想導出大表的話,應結合使用 --quick 選項。
–triggers同時導出觸發器。該選項默認啓用,用 --skip-triggers 禁用它。
其餘參數詳情請參考手冊,我一般使用如下 SQL 來備份 MyISAM 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob -x db_name > db_name.sql
使用如下 SQL 來備份 Innodb 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,若是想要實如今線備份,還可使用 --master-data 參數來實現,以下:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --master-data=1
--single-transaction --flush-logs db_name > db_name.sql
它只是在一開始的瞬間請求鎖表,而後就刷新binlog了,然後在導出的文件中加入CHANGE MASTER 語句來指定當前備份的binlog位置,若是要把這個文件恢復到slave裏去,就能夠採用這種方法來作。
注意:–extended-insert 須要根據實際狀況決定是否啓用或關閉 ,會對數據恢復速度產生較大影響。
1.2 還原
用 mysqldump 備份出來的文件是一個能夠直接倒入的 SQL 腳本,有兩種方法能夠將數據導入。
直接用 mysql 客戶端例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
用 SOURCE 語法其實這不是標準的 SQL 語法,而是 mysql 客戶端提供的功能,例如:
SOURCE /tmp/db_name.sql;
這裏須要指定文件的絕對路徑,而且必須是 mysqld 運行用戶(例如 nobody)有權限讀取的文件。
二、 mysqlhotcopy
2.1 備份
mysqlhotcopy 是一個 PERL 程序,最初由Tim Bunce編寫。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來快速備份數據庫。它是備份數據庫或單個表的最快的途徑,但它只能運行在數據庫文件(包括數據表定義文件、數據文件、索引文件)所在的機器上。mysqlhotcopy 只能用於備份 MyISAM,而且只能運行在類Unix 和 NetWare 系統上。
mysqlhotcopy 支持一次性拷貝多個數據庫,同時還支持正則表達。如下是幾個例子:
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name /tmp (把數據庫目錄 db_name 拷貝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name./regex/ /tmp
更詳細的使用方法請查看手冊,或者調用下面的命令來查看 mysqlhotcopy 的幫助:
perldoc /usr/local/mysql/bin/mysqlhotcopy
注意,想要使用 mysqlhotcopy,必需要有 SELECT、RELOAD(要執行 FLUSH TABLES) 權限,而且還必需要可以有讀取 datadir/db_name目錄的權限。
2.2 還原
mysqlhotcopy 備份出來的是整個數據庫目錄,使用時能夠直接拷貝到 mysqld 指定的 datadir (在這裏是 /usr/local/mysql/data/)目錄下便可,同時要注意權限的問題,以下例:
root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改爲
mysqld
運行用戶)
四、 啓用二進制日誌(binlog)
採用 binlog 的方法相對來講更靈活,省心省力,並且還能夠支持增量備份。
啓用 binlog 時必需要重啓 mysqld。首先,關閉 mysqld,打開 my.cnf,加入如下幾行:
server-id = 1
log-bin = binlog
log-bin-index = binlog.index
而後啓動 mysqld 就能夠了。運行過程當中會產生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 記錄全部對數據的更新操做,後面的文件則是全部binlog 的索引,都不能輕易刪除。關於 binlog 的信息請查看手冊。
須要備份時,能夠先執行一下 SQL 語句,讓 mysqld 終止對當前 binlog 的寫入,就能夠把文件直接備份,這樣的話就能達到增量備份的目的了:
FLUSH LOGS;
若是是備份複製系統中的從服務器,還應該備份 master.info 和 relay-log.info 文件。
備份出來的 binlog 文件能夠用 MySQL 提供的工具 mysqlbinlog 來查看,如:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
該工具容許你顯示指定的數據庫下的全部 SQL 語句,而且還能夠限定時間範圍,至關的方便,詳細的請查看手冊。
恢復時,能夠採用相似如下語句來作到:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 輸出的 SQL 語句直接做爲輸入來執行它。
若是你有空閒的機器,不妨採用這種方式來備份。因爲做爲 slave 的機器性能要求相對不是那麼高,所以成本低,用低成本就能實現增量備份並且還能分擔一部分數據查詢壓力,何樂而不爲呢?
五、 直接備份數據文件
相較前幾種方法,備份數據文件最爲直接、快速、方便,缺點是基本上不能實現增量備份。爲了保證數據的一致性,須要在靠背文件前,執行如下 SQL 語句:
FLUSH TABLES WITH READ LOCK;
也就是把內存中的數據都刷新到磁盤中,同時鎖定數據表,以保證拷貝過程當中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的數據庫目錄下便可。
注意,對於 Innodb 類型表來講,還須要備份其日誌文件,即 ib_logfile* 文件。由於當 Innodb 表損壞時,就能夠依靠這些日誌文件來恢復。
六、 備份策略
對於中等級別業務量的系統來講,備份策略能夠這麼定:第一次全量備份,天天一次增量備份,每週再作一次全量備份,如此一直重複。而對於重要的且繁忙的系統來講,則可能須要天天一次全量備份,每小時一次增量備份,甚至更頻繁。爲了避免影響線上業務,實如今線備份,而且能增量備份,最好的辦法就是採用主從複製機制(replication),在 slave 機器上作備份。
七、 數據維護和災難恢復
做爲一名DBA(我目前還不是,呵呵),最重要的工做內容之一是保證數據表能安全、穩定、高速使用。所以,須要按期維護你的數據表。如下 SQL 語句就頗有用:
CHECK TABLE 或 REPAIR TABLE,檢查或維護 MyISAM 表
OPTIMIZE TABLE,優化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
固然了,上面這些命令起始均可以經過工具 myisamchk 來完成,在這裏不做詳述。
Innodb 表則能夠經過執行如下語句來整理碎片,提升索引速度:
ALTER TABLE tbl_name ENGINE = Innodb;
這實際上是一個 NULL 操做,表面上看什麼也不作,實際上從新整理碎片了。
一般使用的 MyISAM 表能夠用上面提到的恢復方法來完成。若是是索引壞了,能夠用 myisamchk 工具來重建索引。而對於 Innodb表來講,就沒這麼直接了,由於它把全部的表都保存在一個表空間了。不過 Innodb 有一個檢查機制叫 模糊檢查點,只要保存了日誌文件,就能根據日誌文件來修復錯誤。能夠在 my.cnf 文件中,增長如下參數,讓 mysqld 在啓動時自動檢查日誌文件:
innodb_force_recovery = 4
關於該參數的信息請查看手冊。
附:mysqldump詳解:
使用mysqldump導出固定條件的數據庫
咱們來看幾個經常使用用例:
(1)導出整個數據庫
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
(2)導出一個表
mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
(3)導出一個數據庫結構
mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
#-d 不導出數據只導出結構 --add-drop-table 在每一個create語句以前增長一個drop table
(4)導入數據庫,經常使用source 命令
#進入mysql數據庫控制檯,
mysql -u root -p
mysql>use 數據庫
mysql>set names utf8; (先確認編碼,若是不設置可能會出現亂碼,注意不是UTF-8)
#而後使用source命令,後面參數爲腳本文件(如這裏用到的.sql)
mysql>source d:\wcnc_db.sql
上邊的實例只是最基礎的,有的時候咱們可能須要批量導出多個庫,咱們就能夠加上--databases 或者-B,以下語句:
mysqldump -uroot -p --databases test mysql #空格分隔
還有的時候咱們可能須要把數據庫內全部的庫所有備份,咱們就可使用-all-databases,以下語句:
mysqldump -uroot -p -all-databases
可能咱們還會有更多的需求,下面是我在網上找的感受比較全的參數說明,貼出來供你們參考。
參數說明
--all-databases , -A
導出所有數據庫。
mysqldump -uroot -p --all-databases
--all-tablespaces , -Y
導出所有表空間。
mysqldump -uroot -p --all-databases --all-tablespaces
--no-tablespaces , -y
不導出任何表空間信息。
mysqldump -uroot -p --all-databases --no-tablespaces
--add-drop-database
每一個數據庫建立以前添加drop數據庫語句。
mysqldump -uroot -p --all-databases --add-drop-database
--add-drop-table
每一個數據表建立以前添加drop數據表語句。(默認爲打開狀態,使用--skip-add-drop-table取消選項)
mysqldump -uroot -p --all-databases (默認添加drop語句)
mysqldump -uroot -p --all-databases –skip-add-drop-table (取消drop語句)
--add-locks
在每一個表導出以前增長LOCK TABLES而且以後UNLOCK TABLE。(默認爲打開狀態,使用--skip-add-locks取消選項)
mysqldump -uroot -p --all-databases (默認添加LOCK語句)
mysqldump -uroot -p --all-databases –skip-add-locks (取消LOCK語句)
--allow-keywords
容許建立是關鍵詞的列名字。這由表名前綴於每一個列名作到。
mysqldump -uroot -p --all-databases --allow-keywords
--apply-slave-statements
在'CHANGE MASTER'前添加'STOP SLAVE',而且在導出的最後添加'START SLAVE'。
mysqldump -uroot -p --all-databases --apply-slave-statements
--character-sets-dir
字符集文件的目錄
mysqldump -uroot -p --all-databases --character-sets-dir=/usr/local/mysql/share/mysql/charsets
--comments
附加註釋信息。默認爲打開,能夠用--skip-comments取消
mysqldump -uroot -p --all-databases (默認記錄註釋)
mysqldump -uroot -p --all-databases --skip-comments (取消註釋)
--compatible
導出的數據將和其它數據庫或舊版本的MySQL 相兼容。值能夠爲ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options、no_field_options等,
要使用幾個值,用逗號將它們隔開。它並不保證能徹底兼容,而是儘可能兼容。
mysqldump -uroot -p --all-databases --compatible=ansi
--compact
導出更少的輸出信息(用於調試)。去掉註釋和頭尾等結構。可使用選項:--skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys
mysqldump -uroot -p --all-databases --compact
--complete-insert, -c
使用完整的insert語句(包含列名稱)。這麼作能提升插入效率,可是可能會受到max_allowed_packet參數的影響而致使插入失敗。
mysqldump -uroot -p --all-databases --complete-insert
--compress, -C
在客戶端和服務器之間啓用壓縮傳遞全部信息
mysqldump -uroot -p --all-databases --compress
--create-options, -a
在CREATE TABLE語句中包括全部MySQL特性選項。(默認爲打開狀態)
mysqldump -uroot -p --all-databases
--databases, -B
導出幾個數據庫。參數後面全部名字參量都被看做數據庫名。
mysqldump -uroot -p --databases test mysql
--debug
輸出debug信息,用於調試。默認值爲:d:t:o,/tmp/mysqldump.trace
mysqldump -uroot -p --all-databases --debug
mysqldump -uroot -p --all-databases --debug=」 d:t:o,/tmp/debug.trace」
--debug-check
檢查內存和打開文件使用說明並退出。
mysqldump -uroot -p --all-databases --debug-check
--debug-info
輸出調試信息並退出
mysqldump -uroot -p --all-databases --debug-info
--default-character-set
設置默認字符集,默認值爲utf8
mysqldump -uroot -p --all-databases --default-character-set=latin1
--delayed-insert
採用延時插入方式(INSERT DELAYED)導出數據
mysqldump -uroot -p --all-databases --delayed-insert
--delete-master-logs
master備份後刪除日誌. 這個參數將自動激活--master-data。
mysqldump -uroot -p --all-databases --delete-master-logs
--disable-keys
對於每一個表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;語句引用INSERT語句。這樣能夠更快地導入dump出來的文件,由於它是在插入全部行後建立索引的。該選項只適合MyISAM表,默認爲打開狀態。
mysqldump -uroot -p --all-databases
--dump-slave
該選項將致使主的binlog位置和文件名追加到導出數據的文件中。設置爲1時,將會以CHANGE MASTER命令輸出到數據文件;設置爲2時,在命令前增長說明信息。該選項將會打開--lock-all-tables,除非--single-transaction被指定。該選項會自動關閉--lock-tables選項。默認值爲0。
mysqldump -uroot -p --all-databases --dump-slave=1
mysqldump -uroot -p --all-databases --dump-slave=2
--events, -E
導出事件。
mysqldump -uroot -p --all-databases --events
--extended-insert, -e
使用具備多個VALUES列的INSERT語法。這樣使導出文件更小,並加速導入時的速度。默認爲打開狀態,使用--skip-extended-insert取消選項。
mysqldump -uroot -p --all-databases
mysqldump -uroot -p --all-databases--skip-extended-insert (取消選項)
--fields-terminated-by
導出文件中忽略給定字段。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項
mysqldump -uroot -p test test --tab=」/home/mysql」 --fields-terminated-by=」#」
--fields-enclosed-by
輸出文件中的各個字段用給定字符包裹。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項
mysqldump -uroot -p test test --tab=」/home/mysql」 --fields-enclosed-by=」#」
--fields-optionally-enclosed-by
輸出文件中的各個字段用給定字符選擇性包裹。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項
mysqldump -uroot -p test test --tab=」/home/mysql」 --fields-enclosed-by=」#」 --fields-optionally-enclosed-by =」#」
--fields-escaped-by
輸出文件中的各個字段忽略給定字符。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項
mysqldump -uroot -p mysql user --tab=」/home/mysql」 --fields-escaped-by=」#」
--flush-logs
開始導出以前刷新日誌。
請注意:假如一次導出多個數據庫(使用選項--databases或者--all-databases),將會逐個數據庫刷新日誌。除使用--lock-all-tables或者--master-data外。在這種狀況下,日誌將會被刷新一次,相應的因此表同時被鎖定。所以,若是打算同時導出和刷新日誌應該使用--lock-all-tables 或者--master-data 和--flush-logs。
mysqldump -uroot -p --all-databases --flush-logs
--flush-privileges
在導出mysql數據庫以後,發出一條FLUSH PRIVILEGES 語句。爲了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任什麼時候候。
mysqldump -uroot -p --all-databases --flush-privileges
--force
在導出過程當中忽略出現的SQL錯誤。
mysqldump -uroot -p --all-databases --force
--help
顯示幫助信息並退出。
mysqldump --help
--hex-blob
使用十六進制格式導出二進制字符串字段。若是有二進制數據就必須使用該選項。影響到的字段類型有BINARY、VARBINARY、BLOB。
mysqldump -uroot -p --all-databases --hex-blob
--host, -h
須要導出的主機信息
mysqldump -uroot -p --host=localhost --all-databases
--ignore-table
不導出指定表。指定忽略多個表時,須要重複屢次,每次一個表。每一個表必須同時指定數據庫和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user
--include-master-host-port
在--dump-slave產生的'CHANGE MASTER TO..'語句中增長'MASTER_HOST=<host>,MASTER_PORT=<port>'
mysqldump -uroot -p --host=localhost --all-databases --include-master-host-port
--insert-ignore
在插入行時使用INSERT IGNORE語句.
mysqldump -uroot -p --host=localhost --all-databases --insert-ignore
--lines-terminated-by
輸出文件的每行用給定字符串劃分。與--tab選項一塊兒使用,不能用於--databases和--all-databases選項。
mysqldump -uroot -p --host=localhost test test --tab=」/tmp/mysql」 --lines-terminated-by=」##」
--lock-all-tables, -x
提交請求鎖定全部數據庫中的全部表,以保證數據的一致性。這是一個全局讀鎖,而且自動關閉--single-transaction 和--lock-tables 選項。
mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables
--lock-tables, -l
開始導出前,鎖定全部表。用READ LOCAL鎖定表以容許MyISAM表並行插入。對於支持事務的表例如InnoDB和BDB,--single-transaction是一個更好的選擇,由於它根本不須要鎖定表。
請注意當導出多個數據庫時,--lock-tables分別爲每一個數據庫鎖定表。所以,該選項不能保證導出文件中的表在數據庫之間的邏輯一致性。不一樣數據庫表的導出狀態能夠徹底不一樣。
mysqldump -uroot -p --host=localhost --all-databases --lock-tables
--log-error
附加警告和錯誤信息到給定文件
mysqldump -uroot -p --host=localhost --all-databases --log-error=/tmp/mysqldump_error_log.err
--master-data
該選項將binlog的位置和文件名追加到輸出文件中。若是爲1,將會輸出CHANGE MASTER 命令;若是爲2,輸出的CHANGE MASTER命令前添加註釋信息。該選項將打開--lock-all-tables 選項,除非--single-transaction也被指定(在這種狀況下,全局讀鎖在開始導出時得到很短的時間;其餘內容參考下面的--single-transaction選項)。該選項自動關閉--lock-tables選項。
mysqldump -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump -uroot -p --host=localhost --all-databases --master-data=2;
--max_allowed_packet
服務器發送和接受的最大包長度。
mysqldump -uroot -p --host=localhost --all-databases --max_allowed_packet=10240
--net_buffer_length
TCP/IP和socket鏈接的緩存大小。
mysqldump -uroot -p --host=localhost --all-databases --net_buffer_length=1024
--no-autocommit
使用autocommit/commit 語句包裹表。
mysqldump -uroot -p --host=localhost --all-databases --no-autocommit
--no-create-db, -n
只導出數據,而不添加CREATE DATABASE 語句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-db
--no-create-info, -t
只導出數據,而不添加CREATE TABLE 語句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-info
--no-data, -d
不導出任何數據,只導出數據庫表結構。
mysqldump -uroot -p --host=localhost --all-databases --no-data
--no-set-names, -N
等同於--skip-set-charset
mysqldump -uroot -p --host=localhost --all-databases --no-set-names
--opt
等同於--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 該選項默認開啓, 能夠用--skip-opt禁用.
mysqldump -uroot -p --host=localhost --all-databases --opt
--order-by-primary
若是存在主鍵,或者第一個惟一鍵,對每一個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工做花費很長時間。
mysqldump -uroot -p --host=localhost --all-databases --order-by-primary
--password, -p
鏈接數據庫密碼
--pipe(windows系統可用)
使用命名管道鏈接mysql
mysqldump -uroot -p --host=localhost --all-databases --pipe
--port, -P
鏈接數據庫端口號
--protocol
使用的鏈接協議,包括:tcp, socket, pipe, memory.
mysqldump -uroot -p --host=localhost --all-databases --protocol=tcp
--quick, -q
不緩衝查詢,直接導出到標準輸出。默認爲打開狀態,使用--skip-quick取消該選項。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quick
--quote-names,-Q
使用(`)引發表和列名。默認爲打開狀態,使用--skip-quote-names取消該選項。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quote-names
--replace
使用REPLACE INTO 取代INSERT INTO.
mysqldump -uroot -p --host=localhost --all-databases --replace
--result-file, -r
直接輸出到指定文件中。該選項應該用在使用回車換行對(\\r\\n)換行的系統上(例如:DOS,Windows)。該選項確保只有一行被使用。
mysqldump -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt
--routines, -R
導出存儲過程以及自定義函數。
mysqldump -uroot -p --host=localhost --all-databases --routines
--set-charset
添加'SET NAMES default_character_set'到輸出文件。默認爲打開狀態,使用--skip-set-charset關閉選項。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-set-charset
--single-transaction
該選項在導出數據以前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB。本選項和--lock-tables 選項是互斥的,由於LOCK TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick 選項。
mysqldump -uroot -p --host=localhost --all-databases --single-transaction
--dump-date
將導出時間添加到輸出文件中。默認爲打開狀態,使用--skip-dump-date關閉選項。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-dump-date
--skip-opt
禁用–opt選項.
mysqldump -uroot -p --host=localhost --all-databases --skip-opt
--socket,-S
指定鏈接mysql的socket文件位置,默認路徑/tmp/mysql.sock
mysqldump -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock
--tab,-T
爲每一個表在給定路徑建立tab分割的文本文件。注意:僅僅用於mysqldump和mysqld服務器運行在相同機器上。
mysqldump -uroot -p --host=localhost test test --tab="/home/mysql"
--tables
覆蓋--databases (-B)參數,指定須要導出的表名。
mysqldump -uroot -p --host=localhost --databases test --tables test
--triggers
導出觸發器。該選項默認啓用,用--skip-triggers禁用它。
mysqldump -uroot -p --host=localhost --all-databases --triggers
--tz-utc
在導出頂部設置時區TIME_ZONE='+00:00' ,以保證在不一樣時區導出的TIMESTAMP 數據或者數據被移動其餘時區時的正確性。
mysqldump -uroot -p --host=localhost --all-databases --tz-utc
--user, -u
指定鏈接的用戶名。
--verbose, --v
輸出多種平臺信息。
--version, -V
輸出mysqldump版本信息並退出
--where, -w
只轉儲給定的WHERE條件選擇的記錄。請注意若是條件包含命令解釋符專用空格或字符,必定要將條件引用起來。
mysqldump -uroot -p --host=localhost --all-databases --where=」 user=’root’」
--xml, -X
導出XML格式.
mysqldump -uroot -p --host=localhost --all-databases --xml
--plugin_dir
客戶端插件的目錄,用於兼容不一樣的插件版本。
mysqldump -uroot -p --host=localhost --all-databases --plugin_dir=」/usr/local/lib/plugin」
--default_auth
客戶端插件默認使用權限。
mysqldump -uroot -p --host=localhost --all-databases --default-auth=」/usr/local/lib/plugin/<PLUGIN>」
http://see.xidian.edu.cn/cpp/html/1458.html
mysqldump命令用來備份數據庫。
mysqldump命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目錄下執行。
1) 導出整個數據庫(導出文件默認是存在mysql\bin目錄下)
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2) 導出一個表
mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3) 導出一個數據庫結構
mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql
-d 沒有數據 –add-drop-table 在每一個create語句以前增長一個drop table
4) 帶語言參數導出
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql
例如,將aaa庫備份到文件back_aaa中:
[root@test1 root]# cd /home/data/mysql
[root@test1 mysql]# mysqldump -u root -p --opt aaa > back_aaa
1、mysqldump基本例子:
一、備份命令mysqldump格式
格式:mysqldump -h主機名 -P端口 -u用戶名 -p密碼 –database 數據庫名 > 文件名.sql
二、備份MySQL數據庫爲帶刪除表的格式
備份MySQL數據庫爲帶刪除表的格式,可以讓該備份覆蓋已有數據庫而不須要手動刪除原有數據庫。
mysqldump --add-drop-table -uusername -ppassword -database databasename > backupfile.sql
三、直接將MySQL數據庫壓縮備份
mysqldump -hhostname -uusername -ppassword -database databasename | gzip > backupfile.sql.gz
四、備份MySQL數據庫某個(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
五、同時備份多個MySQL數據庫
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql僅僅備六、僅備份份數據庫結構
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
七、備份服務器上全部數據庫
mysqldump –all-databases > allbackupfile.sql
八、還原MySQL數據庫的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
九、還原壓縮的MySQL數據庫
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
十、將數據庫轉移到新服務器
mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename
十一、--master-data 和--single-transaction
在mysqldump中使用--master-data=2,會記錄binlog文件和position的信息 。--single-transaction會將隔離級別設置成repeatable-commited
十二、導入數據庫
經常使用source命令,用use進入到某個數據庫,mysql>source d:\test.sql,後面的參數爲腳本文件。
1三、查看binlog日誌
查看binlog日誌可用用命令 mysqlbinlog binlog日誌名稱|more
1四、general_log
General_log記錄數據庫的任何操做,查看general_log 的狀態和位置能夠用命令show variables like "general_log%" ,開啓general_log能夠用命令set global general_log=on
mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
備份MySQL數據庫爲帶刪除表的格式
備份MySQL數據庫爲帶刪除表的格式,可以讓該備份覆蓋已有數據庫而不須要手動刪除原有數據庫。
mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql
直接將MySQL數據庫壓縮備份
mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
備份MySQL數據庫某個(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
同時備份多個MySQL數據庫
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql
僅僅備份數據庫結構
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
備份服務器上全部數據庫
mysqldump –all-databases > allbackupfile.sql
還原MySQL數據庫的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
還原壓縮的MySQL數據庫
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
將數據庫轉移到新服務器
mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename
2、增量備份
小量的數據庫能夠天天進行完整備份,由於這也用不了多少時間,但當數據庫很大時,就不太可能天天進行一次完整備份了,這時候就可使用增量備份。增量備份的原理就是使用了mysql的binlog志。
一、首先作一次完整備份:
mysqldump -h10.6.208.183 -utest2 -p123 -P3310 --single-transaction --master-data=2 test>test.sql這時候就會獲得一個全備文件test.sql
在sql文件中咱們會看到:
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000002', MASTER_LOG_POS=107;是指備份後全部的更改將會保存到bin-log.000002二進制文件中。
二、在test庫的t_student表中增長兩條記錄,而後執行flush logs命令。這時將會產生一個新的二進制日誌文件bin-log.000003,bin-log.000002則保存了全備事後的全部更改,既增長記錄的操做也保存在了bin-log.00002中。
三、再在test庫中的a表中增長兩條記錄,而後誤刪除t_student表和a表。a中增長記錄的操做和刪除表a和t_student的操做都記錄在bin-log.000003中。
3、恢復一、首先導入全備數據mysql -h10.6.208.183 -utest2 -p123 -P3310 < test.sql,也能夠直接在mysql命令行下面用source導入二、恢復bin-log.000002 mysqlbinlog bin-log.000002 |mysql -h10.6.208.183 -utest2 -p123 -P3310 三、恢復部分 bin-log.000003 在general_log中找到誤刪除的時間點,而後更加對應的時間點到bin-log.000003中找到相應的position點,須要恢復到誤刪除的前面一個position點。能夠用以下參數來控制binlog的區間--start-position 開始點 --stop-position 結束點--start-date 開始時間 --stop-date 結束時間找到恢復點後,既能夠開始恢復。 mysqlbinlog mysql-bin.000003 --stop-position=208 |mysql -h10.6.208.183 -utest2 -p123 -P3310