mysql数据库备份 dump_MySQL数据库备份之mysqldump
創建用戶備份的用戶
MariaDB [mysql]> create user 'backdata'@'localhost' identified by 'test@123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> grant select,lock tables,replication client,reload,show view,event,trigger on *.* to 'backdata'@'localhost';
Query OK, 0 rows affected (0.00 sec)
在本地電腦上,找一塊大的硬盤,然后創建一個目錄,專門存放備份
[root@blog ~]# mkdir /opt/mysql_backup
mysqldump參數詳解
-u 指定用戶
-p 密碼
-P 端口
-S socket文件
-h 主機
--master-data=2表示在dump過程中記錄主庫的binlog和pos點,并在dump文件中注釋掉這一行;
-A 備份所有的數據庫
-B 數據庫? 指定要備份的數據庫
-d 不備份數據,只備份表結構
-e event? 事件
-R 存儲過程
--triggers 觸發器
--single-transaction
--lock-all-tables
注意:在從庫上執行備份時,即--dump-slave=2,這時整個dump過程都是stop io_thread的狀態
理解--single-transaction
thread_id: 35
argument: FLUSH TABLES WITH READ LOCK
說明:因為開啟了--master-data=2,這時就需要flush tables with read lock鎖住全庫,記錄當時的master_log_file和master_log_pos
thread_id: 35
argument: SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
說明:--single-transaction參數的作用,設置事務的隔離級別為可重復讀,即REPEATABLE
READ,這樣能保證在一個事務中所有相同的查詢讀取到同樣的數據,也就大概保證了在dump期間,如果其他innodb引擎的線程修改了表的數據并提交,對該dump線程的數據并無影響
thread_id: 35
argument: START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
這時開啟一個事務,并且設置WITH CONSISTENT
SNAPSHOT為快照級別,如果只是可重復讀,那么在事務開始時還沒dump數據時,這時其他線程修改并提交了數據,那么這時第一次查詢得到的結果是其他線程提交后的結果,而WITH
CONSISTENT
SNAPSHOT能夠保證在事務開啟的時候,第一次查詢的結果就是事務開始時的數據A,即使這時其他線程將其數據修改為B,查的結果依然是A
理解--lock-all-tables
thread_id: 120
argument: FLUSH TABLES WITH READ LOCK
這里flush tables with read lock之后就不會主動unlock tables,保證整個dump過程整個db數據不可更改,也沒有事務的概念了
一)備份和恢復所有庫
[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -A >/opt/mysql_backup/alldata_$(date +%F_%H).sql
[root@blog ~]# cat /opt/mysql_backup/alldata_2018-04-27_11.sql---查看是否存在
如下
(插入完畢后,然后執行UNLOCK tables)
模擬恢復數據
mysql> drop database louisblog;
Query OK, 12 rows affected (0.09 sec)
[root@blog ~]# mysql -u root -p < /opt/mysql_backup/alldata_2018-04-27_11.sql
Enter password:
(由于備份數據的用戶,沒有權限create table和create database,已經insert權限,這邊需要root用戶來操作)
二)備份單個庫
[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -B louisblog > /opt/mysql_backup/louisblog_$(date +%F_%H).sql
Enter password:
[root@blog ~]# mysqldump -S /tmp/mysql.sock -u backdata -p -B mysql > /opt/mysql_backup/mysql_$(date +%F_%H).sql
Enter password:
[root@blog ~]# cd /opt/mysql_backup/
[root@blog mysql_backup]# ll
total 4900
-rw-r--r-- 1 root root 1669688 Apr 27 11:41 alldata_2018-04-27_11.sql
-rw-r--r-- 1 root root 1669688 Apr 27 12:01 alldata_2018-04-27_12.sql
-rw-r--r-- 1 root root 994517 Apr 27 13:19 louisblog_2018-04-27_13.sql
-rw-r--r-- 1 root root 676300 Apr 27 13:20 mysql_2018-04-27_13.sql
還原數據庫
mysql> source /opt/mysql_backup/louisblog_2018-04-27_13.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
三) 分庫備份腳本
#!/bin/bash
#定義變量
USER="backup"
PASS="Aa123321"
HOST="localhost"
DATE="$(date +%F_%H)"
MYCMD="/usr/local/mysql/bin/mysql -u$USER -p$PASS"
BACKUPDIR="/opt/backup/database/"
MYDUMP="/usr/local/mysql/bin/mysqldump -u$USER -p$PASS? -B? -R -E --triggers? --single-transaction --master-data=2"
DBLIST=`$MYCMD -e "show databases;"|sed 1d|egrep -v "_schema|test"`
#判斷備份目錄是否存在
[ ! -d ${BACKUPDIR}/${DATE} ] && mkdir -p ${BACKUPDIR}/${DATE}
#刷新生成二進制日志
$MYCMD -e "flush logs;"
#循環備份數據庫
for dbname in $DBLIST;do
$MYDUMP $dbname|gzip >${BACKUPDIR}/${DATE}/${dbname}.sql.gz
done
#刪除7天前的文件
cd $BACKUPDIR && find . -type d -mtime +7 |xargs rm -f
四)分庫分表備份
#!/bin/bash
#description: Use mysqldump to backup mysql.
# GRANT SELECT, RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup'@'localhost'
#編寫my.cnf文件,添加
#[client]
#user = backup
#password = Aa123321
#定義變量
HOST="localhost"
DATE="$(date +%F_%H)"
MYCMD="/usr/local/mysql/bin/mysql --defaults-extra-file=/etc/my.cnf"
BACKUPDIR="/opt/backup/database"
MYDUMP="/usr/local/mysql/bin/mysqldump --defaults-extra-file=/etc/my.cnf -R -E --triggers -x --master-data=2"
DBLIST=`$MYCMD -e "show databases;"|sed 1d|egrep -v "_schema|test"`
#判斷備份目錄是否存在
[ ! -d ${BACKUPDIR}/${DATE} ] && mkdir -p ${BACKUPDIR}/${DATE}
#刷新生成二進制日志
$MYCMD -e "flush logs;"
#循環備份數據庫
for dbname in $DBLIST;do
TLIST=`$MYCMD -e "show tables from $dbname;"|sed 1d`
for tname in $TLIST;do
mkdir -p $BACKUPDIR/${DATE}/$dbname
$MYDUMP $dbname $tname|gzip >${BACKUPDIR}/${DATE}/${dbname}/${dbname}_${tname}_${DATE}.sql.gz
done
done
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql数据库备份 dump_MySQL数据库备份之mysqldump的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: c mysql 设置字符集_MYSQL字
- 下一篇: 美股周四:三大股指连跌两天,谷歌再跌逾4
