作主從複製通常都是爲了實現讀寫分離,減輕主庫負載或數據分析;爲了數據安全,作備份恢復;主從切換作高可用。還能夠用不一樣的slave扮演不一樣的角色,例如使用不一樣的索引,或不一樣的存儲引擎,或用一個小內存server作slave只用於備份。mysql
若一主一從運行一段時間了,現須要新加一臺從庫,比較方便的方法是用xtrabackup來實現,mysqldump導出100G如下的數據尚可,超過100G建議用xtrabackup;mysqldump是邏輯備份,xtrabackup是物理備份。
主從複製的操做思路:主從版本一致—>主庫受權複製賬號—>確保開啓binlog及主從server_id惟—>xtrabackup恢復到從庫—>記錄xtrabackup_binlog_info中binlog名稱及偏移量—>從庫change master to —>slave start—>檢查兩個yes即OK。正則表達式
Xtrabackup是percona開源的備份工具:
1,可快速可靠的熱備份整個庫的InnoDB、 XtraDB表,無需中止在線服務,不鎖表
2,可在上一次整庫備份基礎上作增量備份(innodb only)
3,以流的形式產生備份,能夠直接保存到遠程機器上,節約磁盤空間
4,備份時不會增大服務器負載,快速完成備份鑑定,並能迅速恢復備份數據,從而提升在線時間
5,缺點是在增量備份的時候,做爲備份基礎的全備文件不能壓縮,不然備份失效;增量的時候,表結構變動的話,變動部分備份無效。sql
新增從庫的完整步驟:
1主、從服務器上都搭好MySQL服務,從服務器上MySQL版本大於等於主服務器,最好徹底一致
2在要作主從同步的服務器上分別安裝XtraBackup
3若是從服務器上有MySQL實例,停掉服務,備份刪除數據庫內容,保留數據庫目錄
4配置主從服務器打開主從同步功能
5主服務器上執行備份
6傳輸備份文件到從服務器,並同步數據文件(apply-log)
7從服務器上恢復備份
8主服務器上受權同步賬號
9從服務器上設置MASTER並開啓同步數據庫
Xtrabackup工具的工做原理是:
innobackupex在後臺線程不斷追蹤InnoDB的日誌文件,而後複製InnoDB的數據文件。
備份分爲兩個過程:
backup,備份階段,追蹤事務日誌和複製數據文件(物理備份)。
preparing,重放事務日誌,使全部的數據處於同一個時間點,達到一致性狀態。安全
全量備份(主庫)
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppass';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT,PROCESS,SUPER ON *.* TO 'bkpuser'@'localhost';服務器
innobackupex --defaults-file=/etc/my.cnf --host=localhost --port=3306 --user=bkpuser --password=bkppass /data/backup/mysqlapp
默認會以當天日期+時間戳命名備份目錄,如 2017-09-12_00-09-02。爲便於拷貝到須要恢復(作從庫)的目錄會對該目錄進行壓縮成tgz文件。socket
全量恢復(從庫)
從庫的配置文件簡單一點能夠從主庫拷貝過來,但要注意
server-id必定不能與主庫相同,不然,會出現錯誤:Slave: received end packet FROM server, apparent master shutdown 工具
從庫通常做爲只讀庫使用,因此爲安全起見,設置只讀 set global read_only=1;可在my.cnf 里加入read-only參數來實現這一點,惟一須要注意的一點是read-only僅對沒有super權限的用戶有效。因此最好覈對一下鏈接從服務器的用戶,確保其沒有super權限。 spa
準備:確認數據庫是關閉的,而且datadir目錄下爲空
innobackupex --use-memory=8G --apply-log 2017-09-12_00-09-02
完了後會輸出相似 InnoDB: Last MySQL binlog file position 0 287289673, file name ./mysql-bin.000158 的信息,後面的設置從庫要用到
恢復:使用新的my.cnf文件,將完整的mysql數據文件拷貝到datadir下
innobackupex --defaults-file=/etc/my.cnf --use-memory=8G --copy-back 2017-09-12_00-09-02
通常是root帳號作的恢復,需在copy-back以後修改數據目錄下文件的屬性:
chown -R mysql.mysql /var/lib/mysql
啓動mysqld服務
mysql> change master to master_host=MASTER_HOST_IP, master_port=3306,
master_user='repuser',master_password='rep_pass',
master_log_file='mysql-bin.000158', master_log_pos=287289673;
mysql> start slave;
mysql> show slave status\G
驗證同步延遲
Master_Log_File: I/O線程當前正在讀取的主服務器二進制日誌文件的名稱。Read_Master_Log_Pos:本機I/O線程讀取主服務器二進制日誌位置
上面2值與在主庫執行show master status;看到的值若是基本接近,說明從庫IO線程已經遇上了主庫的binlog。
Relay_Master_Log_File: 由SQL線程執行的包含多數近期事件的主服務器二進制日誌文件的名稱
Exec_Master_Log_Pos: SQL線程執行來自master的二進制日誌最後一個事件位置
與上面的Relay_Master_Log_File一塊兒,同Master_Log_File、Read_Master_Log_Pos比較,能看到SQL線程是否已經遇上從庫本地的IO線程。
Slave_IO_Running:I/O線程是否啓動併成功鏈接到主服務器上
通常和下面的Slave_IO_Running和Seconds_Behind_Master一塊兒監控主從健康狀態
Slave_SQL_Running:SQL線程是否啓動
Seconds_Behind_Master: 從庫「落後」多少秒
建立部分備份(Creating Partial Backups)
部分備份共有三種方式,分別是:1. 用正則表達式表示要備份的庫名及表名(參數爲--include);2. 將要備份的表名或庫名都寫在一個文本文件中(參數爲--tables-file)以及 3. 將要備份表名或庫名完整的寫在命令行中(參數爲:--databases)。(注:無論你備份哪一個庫或是哪張表,強烈推薦把mysql庫也一塊兒備份,恢復的時候要用)
備份pms庫和test庫
innobackupex --user=root --password=admin@mysql_motone --defaults-file=/etc/my.cnf --include='test.*|pms.*' --slave-info /root/test_dir/
1 恢復部分被備份
1. 中止MySQL:service mysql stop
2. 將/var/lib/mysql下面的全部文件所有刪除:rm /var/lib/mysql/* -rf(若是前面沒有備份mysql數據庫, 那麼在刪除數據文件後要重建mysql系統表,重建命令是sudo mysql_install_db --user=mysql,但重建會致使原有用戶信息所有丟失)
3. 將第二步準備過的文件拷貝到/var/lib/mysql下:cp /usr/local/backup/2015-11-09_16-33-58/* /var/lib/mysql -rf
4. 給文件賦權:chown -R mysql:mysql /var/lib/mysql/
5. 啓動MySQL:service mysql start
2 壓縮備份與解壓
備份:innobackupex --user=root --port=3306--defaults-file=/etc/my.cnf --no-lock --socket=/data/mbdata/open/mysql.sock--stream=tar /home/backup/all/alldb |gzip 1>/home/backup/all/alldb.tar.gz(40G 45分鐘)
解壓縮:tar -izxvf alldb.tar.gz -C backup
3恢復
中止數據庫service mysqld stop;
1):innobackupex--apply-log --user=root --defaults-file=/etc/my.cnf --no-lock /root/alldb
2):備份並刪除原目錄/open/mbdata/open/下全部文件
3):innobackupex--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /root/alldb
若是磁盤不夠,直接mv */data/mbdata/open/
4):chown-Rmysql:mysql/data/mbdata/open
5):service mysqld start;
4增量備份
需要有未壓縮的全量備份文件目錄,先全量再增量
1):週一全量備份,
time /usr/bin/innobackupex --user=root --password=******--host=127.0.0.1 --port=3307 --defaults-file=/etc/my.cnf --slave-info --socket=/data/mbdata/open/mysql.sock--no-timestamp /home/backup/all/alldb 2>$dirlog
2):剩下的週二到週日作增量備份;
5 增量備份腳本
ime /usr/bin/innobackupex --user=root --password=**** --socket=/data/mbdata/open/mysql.sock--port=3307 --slave-info--defaults-file=/etc/my.cnf --no-timestamp --safe-slave-backup --incremental --incremental-basedir=/home/backup/all/alldb/home/backup/daily/daily_20120409 2>>/home/backup/daily/dailybackup_$tday.log
5增量恢復1
壓縮文件
全量恢復,而後增量恢復
1):首先恢復全備innobackupex--apply-log --user=root --defaults-file=/data/mbdata/my.cnf--no-lock /home/backup/all/alldb
PS:/home/backup/all/alldb是全量備份目錄
2):再恢復增量備份innobackupex/home/backup/all/alldb--incremental –incremental dir=/home/backup/daily/daily_2012_03_22 --apply-log
PS:/home/backup/daily/daily_2012_03_22是增量備份目錄
3):中止數據庫,servicemysqldstop;而後備份並刪除原目錄/open/mbdata/open/下全部文件
4):還原數據庫到默認目錄 innobackupex--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /home/backup/all/alldb
5增量恢復2 5):chown-R mysql:mysql/data/mbdata/open 6):service mysqldstart; 7):登錄mysql,驗證數據。 恢復時間:45分鐘左右 6遠程備份 innobackupex --user=root --port=3306 --defaults-file=/data/mbdata/open/my.cnf --slave-info --socket=/data/mbdata/open/mysql.sock --no-timestamp --remote-host=root@10.100.200.53 --scpopt="-Cp-carcfour"/home/backup/all/alldb_$tday2 >> /home/backup/all/allbackup.log $tday2爲變量