天天看點

MySQL增量備份及恢複一 文法格式及指令參數二 mysqldump 的工作原理三 如何做分庫備份四 利用source恢複MySQL資料五 檢視目前資料庫有哪些程序正在連接配接mysql六 檢視目前資料庫參數資訊showvariables七 檢視整個資料庫狀态showglobal status八 修改資料庫參數不重新開機就生效九 mysqlbinlog 解析mysqlbin log日志的

MySQL自帶備份指令->mysqldump

一 文法格式及指令參數

mysqldump -u 使用者名-p 資料庫名> 備份的檔案名字

例子:mysqldump-uroot -p123456 hadoop > /opt/data/mysql_hadoop_

bak.sql

備份過程:它會将将老資料删掉,然後插入或者删除才釋放鎖他會将将老資料删掉,然後插入或者删除才釋放鎖

-A或者--all-databases:備份所有資料庫

mysqldump-uroot -p123456 -A -B -E|gzip > /opt/bak/all.sql.gz

-B:導出腳本會建立庫并加上use 資料庫的過程;并且-B 還可以指定多個庫

預設是不會use 你要導出的資料庫,否則我們在恢複的時候還需要手動建立庫,而且還不了解以前參數

mysqldump-uroot -p123456 -B hadoop > /opt/data/mysql_hadoop_bak.sql

備份多個資料庫:

mysqldump-uroot -p123456 -B hadoop nicky|gzip > /opt/data/hadoop_nicky_gzip_bak.sql

--compact:可以優化輸出内容,讓容量更少,隻是适合調試

mysqldump-uroot -p123456 --compact -B hadoop >

/opt/data/mysql_hadoop_bak.sql

-Y:備份所有表

-y:不備份表空間

-E--events:dumpevents

-F或者--flush-logs :dump之前重新整理bin log

mysqldump-uroot -p123456 -A -B -E -F|gzip > /opt/bak/all.sql.gz

--flush-privileges:dump之後重新整理權限表

-h: 主機名

-P:port

-p:密碼

-R:dump存儲過程

-S指定socket

-t:訓示導出資料

--ignore-table=name不dump指定的表

-x,--lock-all-tables

-d:隻是dump結構,不dump資料

--master-data=1可以保證不重新整理binlog,就是全備的那個點,自動找到,自動找到bin log位置

mysqldump-uroot -p123456 --master-data=1 -B hadoop >/opt/data/hadoop_master_date_bak.sql

--default-charactor-set:指定字元集的mysqldump

mysqldump-uroot -p123456 --default-charactor-set=utf-8 hadoop >

/opt/data/mysql_hadoop_bak.sql

--single-transaction:适合innodb事務資料庫備份

InnoDB表在備份的時候,經常啟用選項:--single-transaction保證備份的一緻性,實際上他的工作原理是設定本次會話隔離級别為

REPEATABLEREAD(可重複讀),以確定本次會話不會看到其他會話已經送出了的資料

Linuxegrep指令用于在檔案内查找指定的字元串。

資料庫名|壓縮格式:支援壓縮

mysqldump-uroot -p123456 -B hadoop|gzip > /opt/data/mysql_hadoop_bak_gzip.sql.gz

此時sql就是一個二進制檔案

恢複:

先删掉表student

mysql-uroot -p123456 -e "use hadoop;drop table student;"

恢複必須指定庫

>>結論:

1導出資料最好使用-B參數

2可以對備份資料進行gzip壓縮

二 mysqldump 的工作原理

我們利用mysql指令備份資料庫的過程,實際上就是把資料從mysql庫裡以邏輯的sql語句形式直接輸出或者生成備份檔案的過程

恢複就是把備份是sql語句在mysql重新執行一次的過程

三 如何做分庫備份

分庫備份:執行一個備份語句備份一個庫,入鍋資料庫有多個庫,就執行多條相同的備份的單個庫備份語句

檢視所有資料庫:

mysql-uroot -p123456 -e "show databases;"|grep -Evi"database|info|test|perf"

grep

-E:支援使用擴充的正則

-e:支援使用标準的正則

-i:忽略大小寫

-v:選中非比對的行

-c:統計行數

字元串結果交給bash運作

echo"ls -al /opt/data"|bash

mysql-uroot -p123456 -e "show databases;"|grep -Evi"database|info|perf|mysql"

hadoop

nicky

test

然後開始循環

#!/bin/bash

DB_PATH=/opt/bak

MYSQL_USER=root

MYSQL_PASSWD=123456

SOCKET=/data/3306/mysql.sock

MYSQL_CMD="mysql-u$MYSQL_USER -p$MYSQL_PASSWD -S $SOCKET"

MYSQL_DUMP="mysqldump-u$MYSQL_USER -p$MYSQL_PASSWD -S $SOCKET -x -B -F -R"

DB_LIST=`$MYSQL_CMD-e "show databases;"|grep -Evi "database|info|perf|mysql"`

[! -d $DB_PATH ] && mkdir -p $DB_PATH

fordbname in $DB_LIST

do

    $MYSQL_DUMP $dbname|gzip >$DB_PATH/${dbname}_$(date +%F).sql.gz

done

>>備份單個表

mysqldump-uroot -p123456 資料庫 表名1 >/opt/bak/hadoop_student.sql

>>備份多個表

mysqldump-uroot -p123456 資料庫 表名1 表名2...> /opt/bak/tables.sql

一般備份方案:

myisam:

mysqldump-uroot -p123456 -A -B --master-data=1 -x -R |gzip > /opt/all.sql.gz

mysqldump-uroot -p123456 -A --flush-privileges --lock-all-tables \

--master-data=1-F --triggers -R -E --hex-blob > /opt/bak/all.sql

innodb:

mysqldump-uroot -p123456 -A -B --master-data=1 --single-transaction -R |gzip >/opt/all.sql.gz

mysqldump-uroot -p123456 -A --flush-privileges --single-transaction \

--master-data=1-F --triggers -R -E --hex-blob > /opt/bak/all.sql

如果兩者都有,以myisam為準

四 利用source恢複MySQL資料

在mysql 執行 sourcedump檔案路徑

如果時gzip格式的,我們需要先解壓檔案

'gzip-d /opt/data/mysql_hadoop_bak.sql.gz'

mysql>source /opt/data/mysql_hadoop_bak.sql

五 檢視目前資料庫有哪些程序正在連接配接mysql

mysql-uroot -p123456 -e "show processlist"

mysql-uroot -p123456 -e "show full processlist"

如果連續兩次show,還有那個程序在哪帶着,可能是慢查詢

六 檢視目前資料庫參數資訊showvariables

mysql-uroot -p123456 -e "show variables;"

$mysql -uroot -p123456 -e "show variables;"|grep log_bin

log_bin     OFF

log_bin_trust_function_creators     OFF

sql_log_bin    ON

七 檢視整個資料庫狀态showglobal status

>>檢視目前會話資料庫狀态showglobal status,很重要,并要做好監控

八 修改資料庫參數不重新開機就生效

key_buffer:myisam引擎存放索引的緩沖區,記憶體空間大了,就減少了去磁盤查找index

setkey_buffer_size=1024*1024*32;

然後配置檔案修改

這樣無論重新開機與否,都生效

九 mysqlbinlog 解析mysqlbin log日志的

作用:

用來記錄mysql内部增删改等對mysql所有資料庫有更新的内容的記錄,隻查不改的不會記錄

指令:

==>檢視binlog日志

如果我們想以可視化的形式檢視日志,需要使用mysqlbinlog來檢視,否則你看到的式二進制檔案 

mysqlbinlog/usr/local/mysql/data/mysql-bin.000001

現在有一個問題,如果全備份已經分庫了,但是使用mysqlbinlog恢複資料的時候,binlog記錄的時所有庫的所有表資料

别的庫沒有問題,然後你在插入資料,别的庫就會報錯。

是以我們需要針對binlog拆庫

==>mysqlbinlog拆庫: -d 指定資料庫名字

我隻想恢複 hadoop庫 的bin log

mysqlbinlog-d hadoop mysql-bin.000001 > /opt/bak/hadoop.sql

==>指定時間和位置點恢複 -r 重定向

mysqlbinlog/usr/local/mysql/data/mysql-bin.000001 --start-position=177 --stop-position=286-r /opt/bak/hadoop_bin.sql

mysqlbinlog/usr/local/mysql/data/mysql-bin.000001 --start-datetime='2016-11-29 11:11:11' \

--stop-datetime='2016-11-2911:11:13' -r /opt/bak/hadoop_bin.sql

比如假設某一個資料庫在早上9點全備份,mysqldump,這時候bin log會記錄一個位置

然後12點資料庫不小心删掉了,那麼先回複全備份,然後9-12點的恢複就靠這期間的

binlog檔案

mysql-uroot -p123456 hadoop < /opt/data/mysql_hadoop_bak.sql

#查找目前目錄下包含字元串“Linux”的檔案

egrepLinux *

繼續閱讀