mysql備份還原(視圖、存儲過程)mysql
最近在工做的時候,要將原來在本機開發的 MySQL存儲過程遷往另外一Linux操做系統下的MySQL數據庫,由於表結構等已經在目標數據庫中存在了,不想直接拷貝數據庫過去,因此用到了MySQL的存儲過程導出和導入,經上網搜索發現用Mysqldump工具能夠實現,具體用法爲:linux
[root@localhost bin]# mysqldump -uroot -p -hlocalhost -P3306 -n -d -t -R DBName > procedure_name.sqlsql
參數說明:數據庫
-n: --no-create-dbwindows
-d: --no-data緩存
-t: --no-create-info服務器
-R: --routines Dump stored routines (functions and procedures)oracle
Mysqldump是客戶端工具用來備份數據庫或在不一樣數據庫之間進行數據遷移。備分內容包含建立活裝載表的SQL語句:函數
主要參數介紹:工具
1.鏈接選項
-u,--user=name
-p,--password=name
-h,--host=name
-P,--port=#
2.輸出內容選項
--add-drop-database
--add-drop-table
-n;--no-create-db
-d;--no-data
-t;--no-create-info
3.輸出格式選項
--compact
-c --complete-insert
-T(指定數據表中的數據備份爲單純的數據文件和建表SQL兩個文件)
注意:xx.sql建表文件是以linux的root用戶建立,而xx.txt文件則是一linux的mysql用戶建立,所以這兩個文件的存放路徑必定要保證mysql用戶有讀寫建立文件的權限。
--fields-terminated-by=name(域分隔符)
--fields-enclosed-by=name(域引用符)
--fields-optionally-enclosed-by=name(域引用可選字符)
--fields-escaped-by=name(轉義字符)
4.字符集選項
--default--character-set=xx
5.其餘選項
-F --flush-logs(備份前刷新日誌)
-l --lock-tables(給全部的表加讀鎖)
最近在備份還原mysql的時候發現,視圖還原報錯,沒法建立視圖,在網上查了下資料,找到如下信息:
一、若是備份的數據庫含有視圖,還原時須要把my.ini中的character-set改成latin1,纔可以還原視圖。
二、還原後,須要把latin1改成gb2312,不然存儲過程不能使用.
三、存儲過程不能隨着數據庫備份,對於存儲過程的還原,仍是經過手工複製SQL語句,在QUERY裏執行。
感受有點麻煩,因而又尋找其它方法,經過如下方法備份mysql數據庫後,再進行還原,就沒有報錯,視圖也還原進去了:
#windows下mysql備份還原,可不用修改my.ini來還原視圖(已驗證)
mysqldump -uroot -p123 --default-character-set=gbk --opt --extended-insert=false --triggers -R --hex-blob -x db_name > f:\db.sql
mysql -uroot -p123 -f db_name < f:\db.sql
linux:
SQL 來備份 MyISAM 表:
/usr/local/mysql/bin/mysqldump -uroot -p123 --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 -uroot -p123 --default -character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob --single-transaction db_name > db_name.sql
參數註解:
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 禁用它。