標籤:mysql備份
mysql備份就哪些情境需要備份呢?這樣的備份有什麼作用呢?切記備份的目的是為了恢複。
情境一:
開發同學要求dba update或者delete一些資料,此時你覺得有必要備份改變前或者刪除前的資料麼。如果有必要你會怎麼做呢?
處理方法:
mysqldump --login-path=xxxx --single-transaction -t dbname tablename -w ‘xxx=xxx‘ > /tmp/xxxx`date +%F_%T`_tmp.sql
有了這樣一個保障,你就算出現問題刪錯或修改錯誤也比保留了未經處理資料。可能你就不用在binlog裡面去找相關資料了。
介紹下mysqldump 接的幾個參數:
--login-path這個是5.6的新特性,其目的可以不用明文把密碼顯示出來,後續我會出一章介紹這個特性。
--single-transaction 其作用是不會鎖表
-t 只備份資料不備份表結構
-w 指定需要備份的資料的條件,舉個栗子 -w ‘modify_time <=2016-05-31 23:59:59‘也就是說只備份根據modfiy_time2016年6月之前的資料。
情境二:
在主從結構中如何備份?首先我們要瞭解什麼情況需要恢複。
故障產生原因1:程式裡面update少了個where語句或delete少了個語句。
解決方案無非就是拿上次的備份結合binlog找出破壞語句的那個pos點拿到測試機器去做相關還原,還可能要停一下業務,這樣的時間會不叫長。
當然也可以寫根據主鍵寫閃回指令碼逆向轉換binlog,但是這樣也不一定是沒有風險的。
如果你做了資料庫的延時同步可以根據程式update的條件將資料取出倒回原表,這個不是一件開心的事情嗎?
這樣做需要在從庫上多加一個執行個體或者用台機器單獨來做延時同步,具體延時多久呢?我的做法是延時2小時,如果2小時還沒發現,那也是蠻悲劇的,當然你也可以根據業務來做這個同步時間的設定。
如果怕資料因為主節點的宕機資料未同步到從節點,建議把binlog記錄備份到其他機器上去,5.6新特性可以去解決這一問題。
做主從的相關參數:
change master to master_host = ‘xxx,
master_user = ‘xxxxx‘
master_password = ‘xxxx‘
master_port = xxxx,
master_log_file = ‘mysql_bin.000xxxxx‘
master_log_pos =452480390,
master_delay=7200;
start slave;
show slave status \G;
情境三:物理備份
物理備份也就是innobackupex,這個特點是速度快,很方便做主從,恢複也快,鎖表時間也很短。但是他只能備份本地機器以及佔用空間也比較大。壓縮後和mysqldump壓縮後相差很大。
可以用nfs等網路技術掛磁碟去做相關備份,解決無法備份到異伺服器的問題。
本人提供一個增量備份指令碼供參考:周日全備份,周一到周6增量備份。
#!/bin/bashcase `date "+zhou%w"` inzhou0)$innobackupex --user=innobackup --password=123456 --no-timestamp $backup_path/`date +%F_full` ;;zhou1)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_full -d "-1 day"` $backup_path/`date +%F_incremental1` ;;zhou2)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental1 -d "-1 day"` $backup_path/`date +%F_incremental2`;;zhou3)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental2 -d "-1 day"` $backup_path/`date +%F_incremental3`;;zhou4)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental3 -d "-1 day"` $backup_path/`date +%F_incremental4`;;zhou5)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental4 -d "-1 day"` $backup_path/`date +%F_incremental5`;;zhou6)$innobackupex --user=innobackup --password=123456 --no-timestamp --incremental --incremental-basedir=$backup_path/`date +%F_incremental5 -d "-1 day"` $backup_path/`date +%F_incremental6`;; *) exit 1;;esac
情境四:邏輯備份
邏輯備份即mysqldump工具去做備份,對於一些重要的表定期備份。
mysqldump --login-path=xxx --single-transaction -t dbname tablename > xxx.sql
如果表比較多可以寫個for迴圈來處理。
#!/bin/bashTABNAME=`/usr/local/mysql/bin/mysql --login-path=xxxxxx -e "use dbname;show tables"`for tabname in $TABNAMEdo/usr/local/mysql/bin/mysqldump --login-path=xxxxxx -t --single-transaction dbname $tabname > /xxxxxx/dbname.$tabname.sqldone
本文出自 “11767337” 部落格,請務必保留此出處http://11777337.blog.51cto.com/11767337/1795997
淺談mysql備份