mysqldump 深刻淺出

mysqldump

mysqldump 是用於轉存儲 mysql 數據庫的實用程序。mysql

主要產生一個 SQL 腳本,其中包含從頭從新建立數據庫的全部命令。sql

導出腳本過程大概以下:建立數據庫判斷語句、刪除表、建立表、鎖表、禁用索引、插入數據、啓用索引、解鎖表。shell

快速使用

# 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 縮寫,和密碼之間不能有空格。bash

--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

表示導出全部的庫。ui

--tables

會覆蓋 --databases or -B 選項,指定導出某個表就會忽略庫選項。編碼

--no-data, -d

不導出數據,只導出表結構。spa

Do not dump table contentscode

--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
複製代碼
相關文章
相關標籤/搜索