備份基礎知識
冷備(cold backup):需要關mysql服務,讀寫請求均不允許狀態下進行;
溫備(warm backup): 服務在線,但僅支持讀請求,不允許寫請求;
熱備(hot backup):備份的同時,業務不受影響。
這種類型的備份,取決于業務的需求,而不是備份工具
MyISAM不支持熱備,InnoDB支持熱備,但是需要專門的工具
完全備份:full backup,備份全部字符集。
增量備份: incremental backup 上次完全備份或增量備份以來改變了的數據,不能單獨使用,要借助完全備份,備份的頻率取決于數據的更新頻率。
差異備份:differential backup 上次完全備份以來改變了的數據。
建議的恢復策略:
完全+增量+二進制日志
完全+差異+二進制日志
全備份
MyISAM:
mysql -uroot ?-p'123456' -A? -B -F ? –flush-privileges ?–master-data=2?–x -–events | gzip > /opt/x_$(date +%F).sql.gz
InnoDB:
mysqldump ? ?-uroot -p123456 ?--single-transaction ??-A -B -F ?--events?| gzip > /server/backup/x_$(date +%F).sql.gz
--single-transaction????MySIM直接選-x(--lock-all-tables)參數鎖表,InnoDB選擇這個參數來保證備份的一致性。相當于設置一個隔離級別,REPEATABLE READ?,以確保本次會話dump時,不會看到其它會話已經提交的數據。
--master-data[=#]?? ? 自動找到binlog的位置? This causes the binary log position andfilename to be
???如: --master-data=1 ? ? 可以不用刷新binlog了,做增量備份的時候很有用
? ? ?? --master-data=2 ? ?后會加個注釋,好找些
-E, --events??????? Dump events.
-A, --all-databases Dump ?導出所有數據,一般加-B?共用+--events all
-B, ?--databases?? ?指定多個庫名備份? ??直觀看,加上-B參數作用是增加創建數據庫和連接數據庫的命令,生產環境備份必用。
-F, --flush-logs ?? 刷新,切割binlog
補充:上訴兩種備份如果數據庫有存儲過程和觸發器還得加兩個參數:
--triggers ?–routines? --hex-blob, ? 一般公司無這三個參數。
觸發器 ? ? ? 存儲過程 ? 如果你庫中有blob字段,而你又沒加這個參數?,那你的blog大字段數據就會丟失
分庫備份
mysql ?-uroot -p'123456' -e "show databases;" | grep -Evi "Database|infor|perf" | sed -r 's#^([a-z].*$)#mysqldump -uroot-p'123456'? --events?-B ?\1 | gzip > /tmp/logs/\1.sql.gz#g' ? ? ?| bash
-t,--no-create-info ????如果希望只導出表數據
-d, --no-data?????? ????只備份表結構No row information.
報錯
mysqlbinlog:unknownvariable'default-character-setutf8'解決方法
mysqlbinlog ?--no-defaults? ?./mysql-bin.000007 ??
mysql全量導出時碰到如下告警: ? ? ? ? ? ? ? ? ? ? 默認是不備份事件表的,只有加了--events?才會不警告
Warning: Skipping the data of table mysql.event. Specify the --events option explicitly
解決辦法:
--events --ignore-table=mysql.event
ERROR 1046 (3D000) at line 22: No database selected
修改.sql ? 在22行前面加上 ? use ? 庫名字;
恢復
首先恢復全備
mysql ? ?-uroot ?-p123456 ? ?< ?/server/backup/x.sql
多分庫文件恢復
for name in `ls *.sql| sed 's#.sql##g' `; do mysql -uroot -p123456 ?? < ${name}.sql ; done
然后
mysqladmin -uroot -p123456 flush-log ? ? ? //切割日志
匯總所有的binlog,?把錯誤的刪除,
剩下的轉成sql語句
cp mysql-bin.000016? /server/backup/
mysqlbinlog? --no-defaults? -d user mysql-bin.000016? ?> bin.sql
mysql? -uroot -p123456? < bin.sql
執行 | mysql
根據binlog位置和時間回復
mysqlbinlog?--start-postion=107 ?--stop-position=1000 ? ?-d ? 庫名 ? ? ? 二進制文件 ? ? ? ? ?
mysqlbinlog?--start-datetime='2013-09-10?00:00:00'?--stop-datetime='2013-09-10?01:01:01'?-d ? 庫名?二進制文件
egrep -v "#|\*|--|^$" ? 可以過濾查看備份內容
rsync配合定時任務
rsync -avz ? /data/3306/mysql-bin.000* ? rsync_backup@10.0.0.18::backup ?--password-file=/etc/rsync.passsword
一主多從,一個從 做備份
vim ?.my.cnf ? ? ? ?//設置登陸
[client]
user=root
host=localhost
password=123456
mysql> show? variables? like "character_set%"; ? //查看字符集
[client] ? ? ? ? ? ? ? ? ? //設置字符集
default-character-set=utf8
[mysqld]
character-set-server=utf8 ? ? //5.5
default-character-set=utf8 ? //5.1
[mysql]
default-character-set=utf8
開啟bin-log,存在一份全備份,及所有增量binlog文件備份
mysql> show ?full ? processlist; //連接情況
mysql>?show variables?like "%log_bin%";
+---------------------------------+-------+
| Variable_name? ? ? ? ? ? ? ? ? ?| Value |
+---------------------------------+-------+
| log_bin? ? ? ? ? ? ? ? ? ? ? ? ?| OFF? ?|
| log_bin_trust_function_creators | OFF? ?|
| sql_log_bin? ? ? ? ? ? ? ? ? ? ?| ON? ? |
+---------------------------------+-------+
mysql> flush? table with read lock; ? //讀鎖
mysql> unlock? tables; ?//解鎖
replicate_wild_ignore_table=mysql.% ? ? //可以加通配符
--skip-name-resolve ? ?選項啟動mysqld來禁用DNS主機名查找
slave-skip-errors = 1032,1062?? //排除1032,1062的保持。
lower_case_table_names=1??//讓MySQL不區分大小寫! ?//慎用,會影響原來的表名字
[mysqld]
read-only??//只讀,root不受限
主從不同步
slave 開啟從庫記錄binlog ? ? ? ? ? ? ? 級聯同步 ? ? ? ?當做數據庫備份
log-bin = /data/3307/mysql-bin
log-slave-updates ?//這個參數用來配置從服務器的更新是否寫入二進制日志,這個選項默認是不打開的,但是,如果這個從服務器B是服務器A的從服務器,同時還作為服務器C的主服務器,那么就需要開發這個選項,這樣它的從服務器C才能獲得它的二進制日志進行同步操作
expire_logs_days = 7 ? ? //保留7天
# mysql -e "show slave status\G;" | egrep 'Slave_IO_Running|Slave_SQL_Running'? | awk '{print $2}' | egrep 'Yes' | wc -l ? ? ? ? ? //監控狀態
mysql數據庫優化
-
硬件優化 ? 物理機
-
軟件優化 ? 系統 ?mysql編譯
-
my.cnf參數優化 ? ? ? //SHOW ?GLOBAL ?STATUS\G; ? ? ? ? ? ? ? ? 工具mysqlreport
-
SQL語句的優化 ? ? ? 索引優化
-
架構的優化
-
流程制度安全優化 ? ? 人的流程 ?測試流程 ? ? ?客戶端phpmyadmin
-