1. 程式人生 > >MySQL mysqldump 資料備份

MySQL mysqldump 資料備份

1、mysqldump命令工具說明

引數註解: mysqldump 是採用SQL 級別的備份機制,它將資料表導成 SQL 指令碼檔案,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。現在來講一下 mysqldump 的一些主要引數: --compatible=name 它告訴 mysqldump ,匯出的資料將和哪種資料庫或哪個舊版本的 MySQL 伺服器相相容。值可以為 ansi 、mysql323 、mysql40 、postgresql 、oracle 、mssql 、db2 、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 禁用它。

2、例子

1.匯出整個資料庫(–hex-blob 為有blob資料做的,防止亂碼和匯入失敗用)

mysqldump -u 使用者名稱 -p 資料庫名 > 匯出的檔名
mysqldump -u root -p --default-character-set=gbk --hex-blob i5a6 > i5a6.sql


2.匯出一個表
mysqldump -u 使用者名稱 -p 資料庫名 表名> 匯出的檔名
mysqldump -u root -p i5a6  users> i5a6.sql


3.匯出一個數據庫結構
mysqldump -u root -p -d --add-drop-table i5a6 >d:/i5a6.sql
-d 沒有資料 –add-drop-table 在每個create語句之前增加一個drop table


4.匯入資料庫
常用source 命令
進入MySQL資料庫控制檯,
如mysql -u root -p
mysql>use 資料庫


然後使用source命令,後面引數為指令碼檔案(如這裡用到的.sql)
mysql>source d:/i5a6.sql

5、Shell指令碼

上面都是比較散的程式碼,下面我們來看shell程式碼

   我首先要在本文帶給你的是完整指令碼。後面會對該指令碼做說明。我假定你已經知道shell scripting、 mysqldump和crontab。

資料庫匯出程式碼,程式碼如下

#!/bin/bash

#1.資料庫資訊定義
mysql_host="192.168.1.1"
mysql_user="root"
mysql_passwd="root"
#sql備份目錄
root_dir="/backup"
back_dir="/backup/databases"
data_dir="databases"
store_dir="database"
if [ ! -d $back_dir ]; then
 mkdir -p $back_dir
fi
#備份的資料庫陣列
db_arr=$(echo "show databases;" | mysql -u$mysql_user -p$mysql_passwd -h$mysql_host)
#不需要備份的單例資料庫
nodeldb="test1"
#當前日期
date=$(date -d '+0 days' +%Y%m%d)
#zip打包密碼
zippasswd="passwd"
zipname="lczh_"$date".zip"

#2.進入到備份目錄
cd $back_dir

#3.迴圈備份
for dbname in ${db_arr}
do
 if [ $dbname != $nodeldb ]; then
  sqlfile=$dbname-$date".sql"
  mysqldump -u$mysql_user -p$mysql_passwd -h$mysql_host $dbname >$sqlfile
 fi
done

#4.tar打包所有的sql檔案
tar -zcPpf $root_dir/$store_dir/$zipname --directory /  $root_dir/$data_dir
#打包成功後刪除sql檔案
if [ $? = 0 ]; then
 rm -r $data_dir
fi

資料定期清理指令碼

 
作用
定期清理14天前的備份檔案
 
 程式碼如下複製程式碼


#!/bin/bash -
#1.引數配置
#mysql檔案備份目錄
backup_dir1="/backup/test1/"
backup_dir2="/backup/test2/"
backdir_arr=($backup_dir1 $backup_dir2)
#過期檔案的時間
keep_time=14
#當前所在星期,crontab在奇數的星期7執行
week=$(date +%W)
flag=`expr $week % 2`
 
#2.清理過期檔案,只在奇數星期7執行
if [ $flag -eq 1 ]; then
 for dir in ${backdir_arr[*]}
 do
  if [ -d $dir ]; then
   #查詢14天之外的檔案資料
   clean_arr=`find $dir -type f -mtime +$keep_time -exec ls {} ;`
   for cleanfile in ${clean_arr}
   do
    rm $cleanfile
   done
  fi
 done
fi

crontab配置
 

程式碼如下
0 5 * * 7  執行清理指令碼

4、其他

最近在備份還原mysql 的時候發現,檢視還原報錯,無法建立檢視,在網上查了下資料,找到以下資訊:

1 、如果備份的資料庫含有檢視, 還原時需要把my.ini 中的character-set 改為latin1, 才能夠還原檢視。 2 、還原後, 需要把latin1 改為gb2312, 否則儲存過程不能使用. 3 、儲存過程不能隨著資料庫備份,對於儲存過程的還原,還是通過手工複製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 -uroot --default-character-set=utf8 --hex-blob -p"kEy31kG_" gameonline | gzip > /data/mysqlback/gameonline`date +%Y-%m-%d_%H%M%S`.sql.gz

最近在備份還原mysql 的時候發現,檢視還原報錯,無法建立檢視,在網上查了下資料,找到以下資訊: 1 、如果備份的資料庫含有檢視, 還原時需要把my.ini 中的character-set 改為latin1, 才能夠還原檢視。 2 、還原後, 需要把latin1 改為gb2312, 否則儲存過程不能使用. 3 、儲存過程不能隨著資料庫備份,對於儲存過程的還原,還是通過手工複製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