MySQL命令之mysqldump -- 数据库备份程序
文章目錄
- 命令介紹
- 常用選項
- 參考示例
- 將指定數據表的數據導出為 SQL 腳本文件和文本文件
- 將指定的多個數據表的數據導出為 SQL 腳本文件和文本文件
- 將指定數據庫導出到腳本文件中
- 將指定的多個數據庫導出到腳本文件中
- 將指定的表導出到腳本文件中
- 將指定數據庫中的多個表的數據導出到指定的文件中
- 將數據表中滿足特定條件的記錄導出
- 導出數據之后生成一個新的 binlog 文件
- 導出指定數據庫的所有表結構
- 導出指定數據表的數據,同時自定義導出數據的格式
- 將指定數據庫的數據全部導出,并備份數據庫的一致性狀態,并在備份文件中記錄二進制日志最后的位置
- 備份指定數據庫的數據,并在備份文件中記錄二進制日志最后的位置,而且刷新日志文件
- 將一個 MySQL 服務器的數據庫的數據復制到另外一個 MySQL 服務器的數據庫中
- 導出所有的數據庫到腳本文件中
- 壓縮備份指定的數據庫
- 將壓縮的備份數據文件解壓,并還原到當前的數據庫服務器中
- 壓縮備份和還原數據
- 結合 Linux 的 cron 命令實現定時備份數據
- 定時執行備份命令語句
- 定時執行備份腳本文件
命令介紹
mysqldump 是 MySQL 用于轉存儲數據庫的客戶端程序。它主要產生一系列的 SQL 語句,可以封裝到文件,該文件包含所有重建您的數據庫所需要的 SQL 命令語句,如 CREATE DATABASE,CREATE TABLE,INSERT 等等。可以用來實現輕量級的快速遷移或恢復數據庫。是 MySQL 數據庫實現邏輯備份的一種方式。
在日常維護工作當中經常會需要對數據進行導出操作,而 mysqldump 則是 MySQL 導出數據時經常用到的命令工具。
mysqldump 命令可用來轉儲數據庫進行備份或將數據轉移到另一個 SQL 服務器(不一定是 MySQL 服務器)。
注意:
1.復制整個數據庫目錄也可以備份數據庫,也是最直接有效的方式,但是只適用于使用了 MyISAM 引擎的數據庫,不適用于使用了 InnoDB 引擎的數據庫。
2.如果你在服務器上進行備份,并且表均為 MyISAM 表,應考慮使用 mysqlhotcopy,因為可以更快地進行備份和恢復。
常用選項
請參閱《MySQL命令之mysqldump的選項詳解》
參考示例
將指定數據表的數據導出為 SQL 腳本文件和文本文件
將數據庫 test 中的數據表 student 導出,導出的文件存放在 /root/test 目錄下:
[root@htlwk0001host ~]# mysqldump -u root -p -T /root/test test student; Enter password:注:
1.選項 -u 指定登錄數據庫的用戶名;選項 -p 輸入登錄密碼;選項 -T 指定導出的數據文件的存放位置
2.執行上面的命令語句后,會得到兩個文件:student.sql 和 student.txt
將指定的多個數據表的數據導出為 SQL 腳本文件和文本文件
[root@htlwk0001host ~]# mysqldump -uroot -pqpw123.com -T /root/test qydpw td_appraise_dimension td_area;注:
1.命令默認將路徑后面的 qydpw 解析為數據庫名稱,后面的詞語解析為數據表的名稱。
2.表名之間只能使用空格分隔。
將指定數據庫導出到腳本文件中
導出文件如果沒有指明路徑,默認是存放在用戶家目錄下。
語法格式:
mysqldump -u用戶名 -p密碼 數據庫名 > 導出的文件名例如,將數據庫 test 導出到文件 test.sql 中:
[root@htlwk0001host ~]# mysqldump -uroot -p123456 test > test.sql說明:
1.默認選項 -p 后面的是數據庫名稱
2.導出的腳本文件存放在當前工作目錄下
3.腳本文件中包含建表語句和插入數據的insert語句,不含創建數據庫的語句
將指定的多個數據庫導出到腳本文件中
[root@htlwk0001host ~]# mysqldump -uroot -p123456 --databases db1 db2 > /tmp/test.sql將指定的表導出到腳本文件中
語法格式:
mysqldump -u 用戶名 -p密碼 數據庫名 表名 > 導出的文件名例如,將數據庫 test 的表 student 導出到文件 student.sql 中:
[root@htlwk0001host ~]# mysqldump -uroot -p123456 test student > student.sql注:
1.命令會自動識別處第一個詞語 test 是數據庫名稱,后面跟著是表的名稱。
2.如果要將表的數據導入到指定的文件中,切記,不能使用選項 -T 或者 --tab 指定文件存放的路徑,因為指定了文件存放的路徑,命令會自己另外生產兩個文件(一個是 .sql 文件,一個是 .txt 文件)存放在指定的路徑下,而你自己指定的文件也會生成,但是不會有任何數據。
3.生成的文件默認存放在當前工作目錄下。
將指定數據庫中的多個表的數據導出到指定的文件中
將數據庫 db1 中的表 a1 和 a2 導出到文件 /tmp/db1.sql 中:
[root@htlwk0001host ~]# mysqldump -uroot -p123456 --databases db1 --tables a1 a2 > /tmp/db1.sql注:切記,如果要將數據導出到你自己指定的文件中,則不能使用選項 -T 或者 --tab 指定文件存放的路徑
將數據表中滿足特定條件的記錄導出
例如,導出數據庫 db1 中的表 a1 中的 id=1 的數據:
[root@htlwk0001host ~]# mysqldump -uroot -proot --databases db1 --tables a1 --where='id=1' > /tmp/a1.sql例如,導出數據庫 db1 中的表 a1 中的 name='liaowenxiong' 的數據:
[root@htlwk0001host ~]# mysqldump -uroot -proot --no-create-info --databases db1 --tables a1 --where="name='liaowenxiong'" > /tmp/a1.sql導出數據之后生成一個新的 binlog 文件
有時候會希望導出數據之后生成一個新的 binlog 文件,只需要加上 -F 參數即可:
[root@htlwk0001host ~]# mysqldump -uroot -proot --databases db1 -F > /tmp/db1.sql導出指定數據庫的所有表結構
語法格式:
mysqldump -u user_name -p -d --add-drop-table database_name > outfile_name.sql說明:
1.選項 -d 或 --no-data 表示不導出行數據
2.選項 --add-drop-table 表示在每個 create table 語句之前增加一個 drop table 語句
3.導出的腳本文件中的內容都是創建表的語句,不含創建數據庫的語句,不含插入數據的語句
例如,將數據庫 test 的數據結構導出到文件 test.sql 文件中:
[root@htlwk0001host ~]# mysqldump -uroot -p1234567 -d --add-drop-table test > test.sql導出的 test.sql 的內容如下所示:
-- MySQL dump 10.13 Distrib 5.7.31, for Linux (x86_64) -- -- Host: localhost Database: test -- ------------------------------------------------------ -- Server version 5.7.31/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;-- -- Table structure for table `dept_htlwk` --DROP TABLE IF EXISTS `dept_htlwk`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `dept_htlwk` (`deptno` varchar(50) NOT NULL COMMENT '部門代碼',`dname` varchar(50) NOT NULL COMMENT '部門名稱',`location` varchar(200) NOT NULL COMMENT '部門地址' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部門表'; /*!40101 SET character_set_client = @saved_cs_client */;-- -- Table structure for table `emp_htlwk` --DROP TABLE IF EXISTS `emp_htlwk`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `emp_htlwk` (`empno` varchar(50) DEFAULT NULL COMMENT '職員代碼',`ename` varchar(50) DEFAULT NULL COMMENT '職員姓名',`job` varchar(50) DEFAULT NULL COMMENT '職員崗位',`salary` decimal(7,2) DEFAULT NULL COMMENT '職員月薪',`bonus` decimal(7,2) DEFAULT NULL COMMENT '獎金',`hiredate` date DEFAULT NULL,`mgr` varchar(50) DEFAULT NULL COMMENT '上級代碼',`deptno` varchar(50) DEFAULT NULL COMMENT '部門代碼' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='職員表'; /*!40101 SET character_set_client = @saved_cs_client */;導出指定數據表的數據,同時自定義導出數據的格式
[root@htlwk0001host ~]# mysqldump -u root -p -T /root/test test student --fields-terminated-by '\t' --fields-enclosed-by '"' --lines-terminated-by '\n';說明:
--fields-terminated-by 'string' # 字段分隔符
--fields-enclosed-by 'char' # 字段引用符
--fields-optionally-enclosed-by 'char' # 字段引用符,只在 char、varchar、text、date 等字段類型上生效
--fields-escaped-by 'char' # 轉義字符
--lines-terminated-by 'string' # 記錄結束符,即換行符
我們看下使用自定義格式導出的文本文件的內容:
[root@htlwk0001host ~]# cat /root/test/student.txt "00000000000000000001" "liaowenxiong" "18" \N \N "2021-09-25 02:40:51" "00000000000000000002" "liudehua" "28" \N \N "2021-09-25 02:40:51" "00000000000000000003" "zhangxueyou" "38" \N \N "2021-09-25 02:40:51"可以看到字段值全部加上了雙引號。
將指定數據庫的數據全部導出,并備份數據庫的一致性狀態,并在備份文件中記錄二進制日志最后的位置
例如,將數據庫 test 的數據全部導出:
[root@htlwk0001host ~]# mysqldump -h10.10.30.241 -uadmin -p123456 --single-transaction --master-data=2 --triggers --routines --events test -T /data/backup/注:
1.會將每個數據表導出成兩個文件:SQL 腳本文件和文本文件。
2.--single-transaction,會在導出數據之前寫入一個 START TRANSACTION SQL 語句,它僅對事務表(如InnoDB)有用,因為它會在啟動事務時轉儲數據庫的一致狀態,而不會阻塞任何應用程序。
3.--master-data=2,將二進制文件最后的位置記錄到備份文件中
在備份文件中你會看到下面這條語句:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4544;上面的語句表示你在備份數據的時候,二進制日志文件名稱是 mysql-bin.000001,而且在備份的時刻,二進制日志文件的最后的位置是 4544,那么將來你要恢復數據,可以從 4544 位置之后開始恢復,因為之前的數據你已經備份成了 SQL 腳本文件,你只要執行這個腳本文件就可以恢復數據了,但是位置 4544 之后發生的數據變化,你就要從這個位置往后慢慢找了。
4.--triggers,導出觸發器
5.--routines,導出存儲過程和函數
6.--events,Include Event Scheduler events for the dumped databases in the output. This option requires the EVENT privileges for those databases.
備份指定數據庫的數據,并在備份文件中記錄二進制日志最后的位置,而且刷新日志文件
[root@htlwk0001host ~]# mysqldump -uroot -pqpw123.com --lock-all-tables --triggers --routines --events --flush-logs --master-data=2 test > /root/test/test.sql說明:
刷新日志文件,會生成一個新的日志文件,而新的日志文件并不是舊的日志文件的復制,我看過新舊日志文件的內容并不相同。
將一個 MySQL 服務器的數據庫的數據復制到另外一個 MySQL 服務器的數據庫中
語法格式:
[root@htlwk0001host ~]# mysqldump --host=host1 -uuser_name -p --opt source_db| mysql --host=host2 -uuser_name -p -C target_db注:host2 主機上已經創建 target_db 數據庫。
例如,將當前數據庫服務器中的數據庫 qydpw 的數據全部復制到 IP 地址為 114.28.38.109 的數據庫服務器的數據庫 test 中:
[root@htlwk0001host ~]# mysqldump -uroot -p123456 --opt qydpw | mysql --host=114.28.38.109 -uroot -p123456 -C test [root@htlwk0001host ~]# mysqldump --host=192.168.80.137 -uroot -proot -C --databases test | mysql --host=192.168.80.133 -uroot -proot test說明:
1.選項 -C 可以啟用壓縮傳遞。
2.如果沒有使用 --opt,mysqldump 就會把整個結果集裝載到內存中,然后導出。如果數據非常大就會導致導出失敗。
導出所有的數據庫到腳本文件中
該命令會導出包括系統數據庫在內的所有數據庫:
[root@htlwk0001host ~]# mysqldump -uroot -proot --all-databases > /tmp/all.sql壓縮備份指定的數據庫
[root@htlwk0001host ~]# mysqldump -uroot -p123456 -P3306 -q -Q --set-gtid-purged=OFF --default-character-set=utf8 --hex-blob --skip-lock-tables --databases test | gzip >/root/test/test.sql.gz[root@htlwk0001host ~]# mysqldump -uroot -p123456 -P3306 -q -Q --set-gtid-purged=OFF --default-character-set=utf8 --hex-blob --skip-lock-tables --databases test 2>/root/test/test.err | gzip >/root/test/test.sql.gz說明:其中的語句 2>/root/test/test.err 表示將標準錯誤內容重定向到文件 test.err 中,如文件存在內容則清空。2> 表示錯誤輸出重定向。
將壓縮的備份數據文件解壓,并還原到當前的數據庫服務器中
[root@htlwk0001host ~]# gunzip -c test.sql.gz | mysql -uroot -pqpw123.com -vvv -P3306 --default-character-set=utf8 1> test.log 2> test.err說明:
1.1> test.log 執行過程信息標準輸出重定向到文件 test.log 中
2.2> test.err 將標準錯誤內容重定向到文件 test.err 中,如文件存在內容則清空
壓縮備份和還原數據
[root@htlwk0001host ~]# mysqldump -hhost_name -uuser_name -ppassword --databases db_name | gzip > backup-file.sql.gz對應的還原動作為:
[root@htlwk0001host ~]# gunzip < backup-file.sql.gz | mysql -uuser_name -ppassword db_name注意:如果數據庫服務器中不存在 db_name,執行上面的還原語句會報錯,把 db_name 去掉即可
結合 Linux 的 cron 命令實現定時備份數據
定時執行備份命令語句
比如需要在每天凌晨 1:30 備份某個主機上的所有數據庫并壓縮 dump 文件為 gz 格式,那么可在 /etc/crontab 配置文件中加入下面代碼行:
30 1 * * * root mysqldump -u root -pPASSWORD --all-databases | gzip > /mnt/disk2/database_`date '+%m-%d-%Y'`.sql.gz前面5個參數分別表示分鐘、小時、日、月、年,星號表示任意。date '+%m-%d-%Y' 得到當前日期的 MM-DD-YYYY 格式。
定時執行備份腳本文件
編寫 Shell 腳本備份 MySQL 數據庫:
[root@htlwk0001host ~]# vi /backup/backup.sh #!bin/bash cd /backup echo "You are in backup dir" mv backup* /oldbackup echo "Old dbs are moved to oldbackup folder" File = backup-$Now.sql mysqldump -u user -p password database-name > $File echo "Your database backup successfully completed"上面腳本文件保存為 backup.sh,并且系統中已經創建兩個目錄 /olcbackup 和 /backup。每次執行 backup.sh 時都會先將 /backup 目錄下所有名稱以 backup 開頭的文件移到 /oldbackup 目錄下。
為上述腳本制定執行計劃如下:
[root@htlwk0001host ~]# crontab -e 30 1 * * * /backup.sh總結
以上是生活随笔為你收集整理的MySQL命令之mysqldump -- 数据库备份程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为A1路由器怎么样水富华为路由器如何
- 下一篇: 如何更换即将坏掉的硬盘电脑如何更换硬盘