mysqldump
文章不保證最新,最新版請到部落格 www.huborui.com/ 檢視。
mysqldump
是用於轉儲存 mysql
資料庫的實用程式。
主要產生一個 SQL
指令碼,其中包含從頭重新建立資料庫的所有命令。
匯出指令碼過程大概如下:建立資料庫判斷語句、刪除表、建立表、鎖表、禁用索引、插入資料、啟用索引、解鎖表。
快速使用
# game 是庫名
# 完整匯出一個庫
# 包括建庫語句、表結構、資料
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 --databases game > test.sql
# 只匯出表結構
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 -d game > test.sql
# 只匯出資料
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 -t game > test.sql
# 匯出一個資料庫中多個表的資料和結構
mysqldump -uroot -proot --host=127.0.0.1 game --tables articles users > test.sql
mysqldump -uroot -proot --host=127.0.0.1 game articles users > test.sql
# 恢復匯出資料
mysql -u username -proot databse < backup.sql
複製程式碼
引數
--user=user_name, -u user_name
連線資料庫的使用者名稱。
--password=password, -p[password]
連線資料庫的密碼,如果使用 -p
縮寫,和密碼之間不能有空格。
--opt or --compact
- 使用
--opt
等於使用這些引數--add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, and --set-charset
,預設情況下即使不加--opt
引數也是開啟的。 - 使用
--compact
等於使用這些引數--skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, and --skip-set-charset
,預設不開啟。
--databases, -B
指定匯出的庫名。
--all-databases
表示匯出所有的庫。
--tables
會覆蓋 --databases or -B 選項,指定匯出某個表就會忽略庫選項。
--no-data, -d
不匯出資料,只匯出表結構。
Do not dump table contents
--no-create-info, -t
只匯出資料,不匯出表結構,不新增 CREATE TABLE
語句。
--no-create-db, -n
不新增 CREATE DATABASE
建庫語句。
--routines, -R
匯出儲存過程以及自定義函式
例項
// 匯出一個資料庫
// 包括建庫語句、刪表語句、建表語句、插入資料
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 --databases game > test.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `game` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `game`;
--
-- Table structure for table `address`
--
DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
...
)
LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
INSERT INTO ...
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
...
// -d 不匯出資料,匯出所有的建表刪表語句,不包括建庫語句,
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 -d game > test.sql
DROP TABLE IF EXISTS `address`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `address` (
...
)
// -t 不匯出結構,匯出所有表中的資料,不包括建庫語句,都是插入語句
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 -t game > test.sql
LOCK TABLES `address` WRITE;
/*!40000 ALTER TABLE `address` DISABLE KEYS */;
/*!40000 ALTER TABLE `address` ENABLE KEYS */;
UNLOCK TABLES;
// 匯出一個資料庫的表結構以及資料,不包括建庫語句
mysqldump -uroot -proot --host=127.0.0.1 --port=3306 game > test.sql
// 匯出多個資料庫的表結構以及資料,包括建庫語句
mysqldump -uroot -proot --host=127.0.0.1 -B game game2 > test.sql
// 匯出多個資料庫的結構,包括建庫語句
mysqldump -uroot -proot --host=127.0.0.1 -d -B game game2 > test.sql
// 匯出多個資料庫的資料,包括建庫語句
mysqldump -uroot -proot --host=127.0.0.1 -t -B game game2 > test.sql
複製程式碼
匯出某個表
// 匯出一個資料庫中一個表的結構,匯出 articles 表的結構和資料
mysqldump -uroot -proot --host=127.0.0.1 game articles > test.sql
// 匯出一個資料庫中多個表的資料和結構
mysqldump -uroot -proot --host=127.0.0.1 game --tables articles users > test.sql
mysqldump -uroot -proot --host=127.0.0.1 game articles users > test.sql
// 匯出一個資料庫中多個表的結構
mysqldump -uroot -proot --host=127.0.0.1 -d game articles users > test.sql
// 匯出一個資料庫中多個表的資料
mysqldump -uroot -proot --host=127.0.0.1 -t game articles users > test.sql
複製程式碼
資料表條件匯出
// 匯出 articles 表 id = 1 的資料
mysqldump -uroot -proot --host=127.0.0.1 --where='id=1' game articles > test.sql
複製程式碼
忽略某張表
--ignore-table database.tableName
複製程式碼
多次新增忽略多張表。
匯入某個表資料指令碼
# 資料來源
src_user="root" # 使用者名稱
src_password="root" # 密碼
src_host="localhost" # Host
src_port="3306" # 埠
src_database="test" # 資料庫名
src_table="edu" # 表名
# 資料匯入的資料庫配置
dst_user="root" # 使用者名稱
dst_password="root" # 密碼
dst_host="localhost" # Host
dst_port="3306" # 埠
dst_database="test" # 資料庫名
mysqldump --host=$src_host --port=$src_port -u$src_user -p$src_password $src_database --tables $src_table | mysql --host=$dst_host --port=$dst_port -u$dst_user -p$dst_password $dst_database
複製程式碼
備份指令碼
#!/bin/bash
# 以下配置資訊請自己修改
mysql_user="root" #MySQL備份使用者
mysql_password="root" #MySQL備份使用者的密碼
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8mb4" #MySQL編碼
backup_db_arr=("db1" "db2") #要備份的資料庫名稱,多個用空格分開隔開 如("db1" "db2" "db3")
backup_location=/var/www/mysql #備份資料存放位置,末尾請不要帶"/",此項可以保持預設,程式會自動建立資料夾
expire_backup_delete="OFF" #是否開啟過期備份刪除 ON為開啟 OFF為關閉
expire_days=3 #過期時間天數 預設為三天,此項只有在expire_backup_delete開啟時有效
# 本行開始以下不需要修改
backup_time=`date +%Y%m%d%H%M` #定義備份詳細時間
backup_Ymd=`date +%Y-%m-%d` #定義備份目錄中的年月日時間
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd #備份資料夾全路徑
welcome_msg="Welcome to use MySQL backup tools!" #歡迎語
# 判斷MYSQL是否啟動,mysql沒有啟動則備份退出
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
echo "ERROR:MySQL is not running! backup stop!"
exit
else
echo $welcome_msg
fi
# 連線到mysql資料庫,無法連線則備份退出
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end
flag=`echo $?`
if [ $flag != "0" ]; then
echo "ERROR:Can't connect mysql server! backup stop!"
exit
else
echo "MySQL connect ok! Please wait......"
# 判斷有沒有定義備份的資料庫,如果定義則開始備份,否則退出備份
if [ "$backup_db_arr" != "" ];then
#dbnames=$(cut -d ',' -f1-5 $backup_database)
#echo "arr is (${backup_db_arr[@]})"
for dbname in ${backup_db_arr[@]}
do
echo "database $dbname backup start..."
`mkdir -p $backup_dir`
`mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz`
flag=`echo $?`
if [ $flag == "0" ];then
echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
else
echo "database $dbname backup fail!"
fi
done
else
echo "ERROR:No database to backup! backup stop"
exit
fi
# 如果開啟了刪除過期備份,則進行刪除操作
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
#`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
`find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
echo "All database backup success! Thank you!"
exit
fi
複製程式碼
修改shell指令碼的屬性:
chmod 600 /root/mysql_backup.sh
chmod +x /root/mysql_backup.sh
複製程式碼
設定好屬性之後,把命令加入 crontab
,設定每天 00:00
定時自動備份。
00 00 * * * /path/to/mysql_backup.sh
複製程式碼
恢復備份
mysql -u username -proot databse < backup.sql
// 和建庫語句一起匯入
mysql -uroot -proot --host=127.0.0.1 --port=33006 < global.sql
或者
mysql -u root -p
use dbname;
source dbname.sql
複製程式碼