目錄
Mysql備份及主從同步
Mysql備份
1. mysqldump全量備份
1.1 mysqldump備份原理
mysqldump備份數據的過程,實際上就是把數據庫從mysql庫里以sql語句的形式直接輸出並保存成文件的過程,備份的文件/* 到 */都是注釋,其余都是sql語句,故備份恢復就相當於把所有sql語句執行一遍
1.2 msyqldump命令詳解
語法:mysqldump -u username -p 數據庫名 [表名]... > 文件路徑
常用選項:
- -A 備份所有數據庫
- -B DBNAME... #能接多個庫,並添加創建庫和切換庫的語句(使用-B備份的sql文件恢復時不需要指定庫,也不用手動創建庫)
- -F 切割binlog
- --master-data=1 #1表示執行從庫從主庫某位置的binlog恢復 ,2表示注釋執行語句
- -x #鎖表
- -d DBNAME #只備份表結構
- --compact #輸出內容減少,用於調試
- --no-create-info|-t #只備份數據
- --single-transaction # 適合innodb事務數據庫備份
1.2 mysqldump備份示例
1.備份所有庫並壓縮
mysqldump -u root -p -A > xx.sql
2.備份某個庫
mysqldump -u root -p -B DBNAME > xx.sql
3.備份多個庫
mysqldump -u root -p -B DBNAME1 DBNAME2 > xx.sql
1.3 備份恢復
mysql -uroot -p < xxx.sql
2.log_bin增量備份
2.1 開啟log_bin功能
修改my.cnf中的[mysqld]:
#添加該選項
[mysqld]
log_bin=mysqlbin
生成的日志文件存放的是該功能開啟后的mysql內部增刪改等對數據庫有更新內容的sql語句。
該功能開啟前的數據並不能通過這個恢復。所以通常先是使用mysqldump全量備份,之后的數據通過log_bin生成的日志文件來恢復
若在mysqldump備份時指定了--master-data=1,會將備份數據最后的位置記錄下來,則數據恢復時將大大方便log_bin從合理的位置恢復
2.2 利用mysqlbinlog命令導出sql文件
mysqlbinlog mysql-bin.00001 > 1.sql
#-d DB #只導出指定庫sql語句,默認binlog會保存所有庫的操作
mysqlbinlog -d test mysql-bin.00001 > 1.sql
基於指定位置導出sql語句:
mysqlbinlog mysqlbin.00001 --start-position=106 >1.sql #導出從位置106開始到文件結束的sql語句
mysqlbinlog mysqlbin.00001 --stop-position=500 >2.sql #導出從文件開始到位置為500處的sql語句
mysqlbinlog mysqlbin.00001 --start-position=106 --stop-position=500 >3.sql #導出從位置106到500的sql語句
基於指定時間導出:
mysqlbinlog --start-datetime="2019-02-22 16:52:06" mysqlbin.000001 > 1.sql
mysqlbinlog --stop-datetime="2019-02-22 16:52:06" mysqlbin.000001 > 2.sql
mysqlbinlog --start-datetime="2019-02-22 16:52:06" --stop-datetime="2019-02-22 17:52:06" mysqlbin.000001 > 3.sql
2.3 備份恢復
mysql -uroot -p < 1.sql #通常先將全量備份的數據恢復,然后用msyqlbinlog導出的文件接着全量的恢復后面的數據
Mysql主從同步配置
1.1主從同步過程
- 1.從庫IO線程連接上主庫,並請求從指定日志文件的指定位置之后的日志內容
- 2.主庫收到來自從庫的請求后,負責復制的IO線程根據請求信息讀取指定日志指定位置之后的日志內容,並返回給從庫的IO線程
- 3.從庫接收到信息后,將接收到的內容依次寫到從庫的Relaylog文件的最末端,並讀取其中主庫的bin-log文件名和位置記錄到master-info文件中,以便下次讀取時能清楚的告訴主庫"我需要從bin-log文件的哪個位置開始往后的內容"
- 4.從庫的SQL線程檢測到Relaylog中新增的內容后,會馬上解析該文件中的內容,形成SQL語句並執行,從而完成同步
1.2 配置
主庫配置
- 1.主庫開啟log_bin 功能,並設置server_id
[mysqld]
server_id=1111
log_bin=mysqlbin
- 2.主庫創建主從同步的mysql賬號,並授予replication,slave權限
mysql -e "GRANT replication slave *.* to 'repl'@'192.168.139.0/255.255.255.0' identified by 'repl'" -uroot -p
- 3.主庫整庫鎖表,然后備份已有數據生成sql文件,並拷貝至從庫服務器,完成后解鎖主庫
mysql -e " flush table with read lock " -uroot -p123456
mysqldump -uroot -p123456 -A --master-data=1 > repl.sql
scp repl.sql root@192.168.139.106:~
mysql -e " unlock tables " -uroot -p123456
從庫配置
- 1.設置server_id, 從庫一般不需要開啟log_bin功能,除非做級聯,即同時還作為其他庫的主庫
[mysqld]
server_id=2222 #需要跟主庫不一致
- 2.先手動復制主庫的數據到從庫
mysql -uroot -p123456 < repl.sql
- 3.如果主庫配置第三步中,備份數據時沒有指定--master-data=1 ,則需要在從庫中指定主庫信息
mysql -e "change master to \
master_host='192.168.139.105', \
master_log_file='mysqlbin.000004',\
master_user='repl',master_password='repl',\
master_log_pos=326 "
- 4.從庫開啟同步開關
mysql -uroot -p123456 -e " start slave;"