MySQL的備份包括邏輯備份和物理備份
邏輯備份是指備份產生數據的語句,如CREATE DATABASE,CREATE TABLE和INSERT,把這些語句導出,然後存儲到一個腳本中。恢復時,把這個腳本導入到數據庫。有很強的兼容性,甚至可以跨平臺備份和恢復。
物理備份指把對應的數據庫文件拷貝到其他地方。可以跨平臺備份和恢復。
MySQL的備份也可以分爲完全備份,增量備份等
MySQL的備份分爲熱備份(Hot backup,支持讀和寫),溫備份(Warm backup,只支持讀),冷備份(Cold backup ,不支持讀和寫)
備份內容:二進制日誌(主要用於增量備份,或建立從服務器),InnoDB日誌文件(用於物理備份),MySQL的配置文件(如/etc/my.cnf),從服務器的上的slave position information 和relay logs ,及數據庫本身。
備份工具:mysqldump (邏輯備份工具),SELECT INTO OUTFILE(邏輯備份工具),mk-parallel-backup(可以實現並行備份,要求cpu是多核的,第三方工具),ibbackup(專用於INNODB),BACKUP(MySQL 6.0以上纔有此工具),Snapshot,mysqlhotcopy(MyISAM)
mysqldump命令
db_name[tb1][tb2] 指定數據庫中的表
--all-databases 備份所有數據庫
--databases 指定數據庫
--events 導出 CREATE EVENT語句
--extended-insert
--flush-logs 用於日誌滾動
--insert-ignore 用insert-ignore代替insert
--lock-all-tables 鎖定所有表
--lock-tables 鎖定某一表
--master-data=n 導出二進制文件名稱和位置,n=1時,改變主服務器,n=2時,不再改變主服務器
--no-data 不備份數據
--opt 等同於同時添加--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqldump 很快的導出數據,並且導出的數據能很快導回。該選項默認開啓,但可以用 --skip-opt 禁用
--replace 用REPLACE代替INSERT,由插入語句改爲替換語句
--routines 導出自定義函數和存儲過程
--single-transaction 在導出數據之前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於事務表,例如 InnoDB 和 BD
--triggers 導出觸發器,該選項默認啓用,用 --ski禁用它p-triggers
--where 指定導出表中的哪些數據
如:mysqldump --databases mysql test > test.sql;
mysqldump mysql --where=”name=’user’” >test.sql;
在很多情況下需要用到管理員賬號和密碼,如:
mysqldump -uroot –p --all-databases > dump.sql;
mysqldump -uroot -p mydb t1 > mydb.sql;
恢復和還原:
方式1>mysql -uroot –p db_name < db.name.sql
方式2>SOURCE /tmp/db_name.sql;
SELECT INTO OUTFILE 命令:
如:SELECT * INTO OUTFILE ‘/tmp/t1.txt’ FROM t1;
恢復: LOAD DATA INFILE ‘/tmp/t1.txt’ INTO TABLE t1;
mk-parallel-dump 命令:(http://www.maatkit.org/)
使用方式 mk-parallel-dump --basedir=/backups
恢復 mk-parallel-restore /backups
文件系統快照(file system snapshot)
mysqlhotcopy 命令:
--addtodest 把備份結果添加到某一目錄下
--allowold 如果該目錄已存在,就把原目錄重命名,放到一旁
--checkpoint=db_name.table_name
--dryrun 測試
--flushlogs 日誌滾動
--keepold 不刪除原有的備份文件
--method 取值cp或scp,可以遠程備份
--regexp 支持正則表達式選擇匹配的數據庫或表
--resetmaster 表被鎖定後,運行 RESET MASTER命令,重新設置二進制日誌
--resetsalve 表被鎖定後,運行 RESET SLAVE命令
如: mysqlhotcopy mydb /backup
mysqlhotcopy --method=scp mydb [email protected]:/backup 備份到遠程主機
恢復與還原
mysqlhotcopy
備份出來的是整個數據庫目錄,使用時可以直接拷貝到 mysqld
指定的 datadir (在這裏是 /usr/local/mysql/data/)目錄下即可,要注意權限的問題cp –rf db_name /usr/local/mysql/data/
chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改成
mysqld
運行用戶)MySQL的還原:
mysqlbinlog
--start-datetime=”date_time”
--stop-datetime=”date_time”
--start-position=start_log_position
--stop-position=stop_log_position
1>時間點還原
1)還原整個數據庫
2)還原二進制日誌(以數字結尾),按順序還原
mysqlbinlog mysql-bin.000003 > mysql-bin.000003.sql
mysqlbinlog –stop-datetime=’2009-08-20 15:42:48’ mysql-bin.000002 > mysql-bin.000002.sql
replication (複製)
MySQL支持兩種複製,基於語句複製(MySQL 3.23 後)和基於行的複製(MySQL 5.1後)
爲何使用複製
1 數據的異地分佈 2本地服務器平衡 3 備份 4 高可用和故障轉移 5 測試升級
replication 工作
1) 主服務器記錄數據到二進制日誌
2) 從服務器複製此二進制日誌到重置日誌(Relay log)
3) 從服務器把重置日誌寫入數據庫
主服務器:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO test@’192.168.0.%’ IDENTIFIED BY ‘password’;
log_bin =mysql-bin
server_id =10
重新啓動MySQL
mysql> SHOW MASTER STATUS;
從服務器:
log_bin =mysql-bin
server_id =2
relay_log =mysql-relay-bin
log_slave_updates =1
read_only =1
mysql>CHANG MASTER TO MASTER_HOST=’server1’,
->MASTER_USER=’test’,
->MASTER_PASSWORD=’password’,
->MASTER_LOG_FILE=’mysql-bin.000001’,
->MASTER_LOG_POS=0;
SHOW SLAVE STATUS\G
start slave