本文首發在《旺旺知識庫》html
使用mysqldump備份時,若是存儲引擎爲MyISAM,則只能實現溫備份,並需使用選項--lock-all-tables鎖定全部表。若是存儲引擎爲InnoDB,則加上--single-transaction選項,能夠實現熱備。mysql
使用mysqldump進行邏輯備份,還存在以下問題:sql
浮點數據丟失精度;數據庫
備份出的數據更佔用空間;不過可壓縮後以大大節省空間服務器
不適合對大數據庫(如一個庫超過10G)作徹底備份dom
另外對InnoDB而言,須要使用mysql> FLUSH TABLES WITH READ LOCK;刷新並鎖定表時,可能須要花大量的時間ide
對InnoDB而言,即便鎖定了,也不必定覺得着沒有數據的寫入,此時事務日誌可能還在同步到永久存儲測試
SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];大數據
LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;spa
mysql> SELECT * INTO OUTFILE '/tmp/tutors.txt' FROM tutors;
Query OK, 8 rows affected (0.31 sec)[root@localhost ~]# cat /tmp/tutors.txt
2 HuangYaoshi M 63
3 Miejueshitai F 72
4 OuYangfeng M 76
6 YuCanghai M 56
7 Jinlunfawang M 67
8 HuYidao M 42
9 NingZhongze F 49
14 HuFei M 31
注意:導出的僅僅是數據,表結構並不會被導出。
mysql> CREATE TABLE test_tb LIKE tutors;
Query OK, 0 rows affected (1.28 sec)
mysql> LOAD DATA INFILE '/tmp/tutors.txt' INTO TABLE test_tb;
Query OK, 8 rows affected (0.17 sec)
Records: 8 Deleted: 0 Skipped: 0 Warnings: 0
$ mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master-`date +%F`.info
查看當前日誌:
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysqld-binlog.000007 | 650 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
備份增量日誌:須要注意的是,因爲我使用了[FLUSH LOGS]滾動日誌,所以理論上使用lvm快照卷備份後有兩個日誌的增量數據須要備份,即:mysqld-binlog.000006和mysqld-binlog.000007
查看備份開始時的日誌位置:
[root@localhost ~]# cat /data/backup/master-2013-09-23.info
*************************** 1. row ***************************
File: mysqld-binlog.000006
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
導出日誌:
[root@localhost ~]# mysqlbinlog --start-position=120 /data/mysql/mysqld-binlog.000006 >/data/backup/06.sql
[root@localhost ~]# mysqlbinlog /data/mysql/mysqld-binlog.000007 >/data/backup/07.sql
我這裏仍是採用直接刪除數據文件目錄:
<a href="http://www.toxingwang.com/wp-content/uploads/2013/10/mysql4.jpg" class="cboxElement" rel="example4" 1523"="" style="text-decoration: none; color: rgb(1, 150, 227);">
此時已經沒法正常中止mysqld了:
[root@localhost data]# service mysqld stop
ERROR! MySQL server PID file could not be found![root@localhost data]# killall mysqld
[root@localhost data]# cp -R /data/backup/full-bak-2013-09-23/mysql /data/
cp:是否覆蓋"/data/mysql/localhost.localdomain.err"? yes[root@localhost mysql]# chown mysql.mysql -R /data/mysql
[root@localhost data]# service mysqld start
Starting MySQL SUCCESS!
[root@localhost ~]# mysql -uroot -p </data/backup/06.sql
[root@localhost ~]# mysql -uroot -p </data/backup/07.sql
設置每一個表獨立使用一個表空間 [root@localhost ~]# echo "innodb_file_per_table = 1" >>/etc/my.cnf 重啓生效: [root@localhost ~]# service mysqld restart