一、數據備份
#1. 物理備份: 直接復制數據庫文件,適用於大型數據庫環境。但不能恢復到異構系統中如Windows。 #2. 邏輯備份: 備份的是建表、建庫、插入等操作所執行SQL語句,適用於中小型數據庫,效率相對較低。 #3. 導出表: 將表導入到文本文件中。
#語法: # mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 文件路徑+備份文件.sql #示例: #單庫備份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多庫備份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #備份所有庫 mysqldump -uroot -p123 --all-databases > all.sql
cmd命令書寫效果展示
二、恢復數據
#方法一: [root@localhost backup]# mysql -uroot -p123 < /backup/all.sql #方法二: mysql> use db1; mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql #注:如果備份/恢復單個庫時,可以修改sql文件 DROP database if exists school; create database school; use school;
總結:
基本語法:windows系統
[cmd窗口]C:\WINDOWS\system32> mysql -u 用戶名 -p > 備份文件的路徑+文件名(如c:/db1.sql)
mysql -u 用戶名 -p < 需恢復文件的路徑+文件名(如c:/db1.sql)
基本語法:linux系統
[shell窗口]C:\WINDOWS\system32> mysql -u 用戶名 -p > 備份文件的路徑+文件名(如c:/db1.sql)
mysql -u 用戶名 -p < 需恢復文件的路徑+文件名(如c:/db1.sql)
> 備份;
< 恢復;
三、備份/恢復案例

#數據庫備份/恢復實驗一:數據庫損壞 備份: 1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql 2. # mysql -uroot -p123 -e 'flush logs' //截斷並產生新的binlog 3. 插入數據 //模擬服務器正常運行 4. mysql> set sql_log_bin=0; //模擬服務器損壞 mysql> drop database db; 恢復: 1. # mysqlbinlog 最后一個binlog > /backup/last_bin.log 2. mysql> set sql_log_bin=0; mysql> source /backup/2014-02-13_all.sql //恢復最近一次完全備份 mysql> source /backup/last_bin.log //恢復最后個binlog文件 #數據庫備份/恢復實驗二:如果有誤刪除 備份: 1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql 2. mysql -uroot -p123 -e 'flush logs' //截斷並產生新的binlog 3. 插入數據 //模擬服務器正常運行 4. drop table db1.t1 //模擬誤刪除 5. 插入數據 //模擬服務器正常運行 恢復: 1. # mysqlbinlog 最后一個binlog --stop-position=260 > /tmp/1.sql # mysqlbinlog 最后一個binlog --start-position=900 > /tmp/2.sql 2. mysql> set sql_log_bin=0; mysql> source /backup/2014-02-13_all.sql //恢復最近一次完全備份 mysql> source /tmp/1.log //恢復最后個binlog文件 mysql> source /tmp/2.log //恢復最后個binlog文件 注意事項: 1. 完全恢復到一個干凈的環境(例如新的數據庫或刪除原有的數據庫) 2. 恢復期間所有SQL語句不應該記錄到binlog中
四、實現自動化備份

備份計划: 1. 什么時間 2:00 2. 對哪些數據庫備份 3. 備份文件放的位置 備份腳本: [root@localhost~]# vim /mysql_back.sql #!/bin/bash back_dir=/backup back_file=`date +%F`_all.sql user=root pass=123 if [ ! -d /backup ];then mkdir -p /backup fi # 備份並截斷日志 mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file} mysql -u${user} -p${pass} -e 'flush logs' # 只保留最近一周的備份 cd $back_dir find . -mtime +7 -exec rm -rf {} \; 手動測試: [root@localhost ~]# chmod a+x /mysql_back.sql [root@localhost ~]# chattr +i /mysql_back.sql [root@localhost ~]# /mysql_back.sql 配置cron: [root@localhost ~]# crontab -l 2 * * * /mysql_back.sql
五、表的導入導出 (建議使用可視化軟件(navicat)進行數據導入,比較方便)

SELECT... INTO OUTFILE 導出文本文件 示例: mysql> SELECT * FROM school.student1 INTO OUTFILE 'student1.txt' FIELDS TERMINATED BY ',' //定義字段分隔符 OPTIONALLY ENCLOSED BY '”' //定義字符串使用什么符號括起來 LINES TERMINATED BY '\n' ; //定義換行符 mysql 命令導出文本文件 示例: # mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt # mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml # mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html LOAD DATA INFILE 導入文本文件 mysql> DELETE FROM student1; mysql> LOAD DATA INFILE '/tmp/student1.txt' INTO TABLE school.student1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '”' LINES TERMINATED BY '\n';
六:數據遷移(版本相同)
務必保證在相同版本之間遷移 # mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目標IP -uroot -p456