一、mysql的備份無非有下面幾種方式
1、mysqldump工具
MySQL自己提供的mysqldump是把資料轉換為SQL語句,這種方式的效率比較低,備份與還原的速度都很慢,而且在dump過程中為了保證資料一致性,任何資料插入和更新操作都會被掛起。
2、mysqlhotcopy工具
MySQL自己提供的mysqlhotcopy 是專門針對myisam 資料表進行備份,無法對innodb資料表備份,速度相對快些,因為是檔案拷貝,而且在備份的過程中,任何資料插入和更新操作都會被掛起。
3、採用Linux LVM的 snapshot 功能進行資料庫分區的備份
這種方法是利用的邏輯卷的 鏡像 功能對整個分區進行線上備份,這種備份資料量大,而且備份效能低下 < ?xml:namespace prefix = o />
4、準備一台從伺服器,開啟日誌同步功能,專門做備份(master-slave方式)
這種備份方法個人認為比較好,開始日誌同步功能,無論是myisam,還是innodb,都可以在7*24不影響主伺服器的情況下,隨心所欲的進行備份
二、Xtrabackup工具對MySQL資料庫進行備份
1、Xtrabackup簡介
官方網站:http://www.percona.com/
下載地址:http://www.percona.com/percona-builds/
Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。本文測試使用的是0.8版本,與當前最新版本是0.9區別並不大。Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表
(2)innobackupex1.5.1則封裝了xtrabackup,是一個指令碼封裝,所以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖
(3)使用協助:http://www.percona.com/docs/wiki/percona-xtrabackup:start
2、安裝Xtrabackup
安裝Xtrabackup有幾種方法:
第一種:通過源碼進行安裝
第二種:通過yum來安裝
[percona]
name=CentOS-$releasever - Percona
baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/
gpgcheck=0
第三種:直接使用xtrabackup、innobackupex這兩個二進位可執行檔即可
[root@SQL1 ~]wget http://www.percona.com/percona-builds/XtraBackup/XtraBackup-1.2/Linux/binary/i686/xtrabackup-1.2.tar.gz
[root@SQL1 ~]cp innobackupex-1.5.1 tar4ibd xtrabackup /usr/sbin
3、安裝Xtrabackup
1)innobackupex工具
(1)備份操作(下列是幾個例子)
####備份employess資料庫(標準備份)####
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=employees /root/backup 1> process_log 2>&1 &
注意:將資料庫employees備份到目錄/root/backup/XXXX下
[root@SQL1 ~]# ls -l /root/backup
total 4
drwxr-xr-x 3 root root 4096 Apr 13 14:16 2010-04-13_14-14-43
####備份給定的資料庫列表中的資料庫中(標準備份)####
[root@SQL1 ~]# cat backup_db_name
school
employees
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=/root/backup_db_name /root/backup 1> process_log 2>&1 &
或者
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=“school employees” /root/backup 1> process_log 2>&1 &
####備份employess資料庫中的employess表(標準備份)####
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases="employees.employees" /root/backup 1> process_log 2>&1 &
####備份所有的資料庫,並打包(tar方式)#####
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 1> /root/backup/all_databases.tar 2> process_log &
####備份所有的資料庫並壓縮,並打包壓縮(tar+gzip方式)####
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 2> process_log | gzip > /root/backup/all_databases.tar.gz &
注意:首先要先建立備份目錄:/root/backup,--databases=[ db_name.tb_name | db_name ],如果不使用--databases參數的話,那麼將備份所有的資料庫
(2)恢複操作
(步驟:先apply log,再copy back,最後再chown -R mysql:mysql datadir)
####(標準備份)的還原作業######
[root@SQL1 ~]# ls -l /root/backup/2010-04-13_15-02-37/
total 223484
-rw-r--r-- 1 root root 348 Apr 13 15:02 backup-my.cnf
drwxr-xr-x 2 root root 4096 Apr 13 15:03 employees
-rw-r--r-- 1 root root 228589568 Apr 13 15:03 ibdata1
-rw-r--r-- 1 root root 0 Apr 13 15:03 mysql-stderr
-rw-r--r-- 1 root root 379 Apr 13 15:03 mysql-stdout
-rw-r--r-- 1 root root 1 Apr 13 15:03 xtrabackup_binlog_info
-rw-r--r-- 1 root root 60 Apr 13 15:03 xtrabackup_checkpoints
-rw-r--r-- 1 root root 2048 Apr 13 15:02 xtrabackup_logfile
-rw-r--r-- 1 root root 53 Apr 13 15:03 xtrabackup_slave_info
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/2010-04-13_15-02-37
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/2010-04-13_15-02-37
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup*
####(tar方式備份)的還原作業######
[root@SQL1 ~]# mkdir /root/backup/db
[root@SQL1 ~]# tar -ixvf all_databases.tar -C /root/backup/db(先解壓,注意必須跟-i參數)
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup
[root@SQL1 ~]# rm -rf /root/backup/db
####(tar+gzip方式備份)的還原作業######
[root@SQL1 ~]# mkdir /root/backup/db
[root@SQL1 ~]# tar -izxvf all_databases.tar.gz -C /root/backup/db(先解壓,注意必須跟-i參數)
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup
[root@SQL1 ~]# rm -rf /root/backup/db
其實:可以不使用copy-back操作,而是直接拷貝備份檔案中的資料到datadir目錄下即可
cp employees ibdata1 ib_logfile0 ib_logfile1 mysql school test /usr/local/mysql/data/ -rf && chown -R mysql:mysql /usr/local/mysql/data
如果您不關心binary log position of backup 或者all the tables are innodb,那麼可以加上--no-lock參數