Bugzill 是以mysql作为后台的数据库,所有的数据都存储在mysql中,所以bugzilla的备份最重要的就是对mysql的备份。所以我们先要看一下mysql的备份方法。

 

1.mysqldump

   Myssql提供了一个mysqldump备份命令,这个是安装mysql时一起装进系统的,不要另外安装。具体使用方法:

 

#对所有的数据库进行备份:

mysqldump –-all-databases –-opt  > db.sql

 

#仅对mydb数据库进行备份:

mysqldump –-databases –-opt mydb  > db.sql

 

Mysqldump具体参数可以参考 man mysqldump

 

#恢复备份:

mysql –u root –ppassword

 

#进入mysql命令模式

 

mysql>source db.sql

 

 

2.mysql增量备份:

    Mysql提供了一种基于log的增量备份机制,要启动log系统(mysql默认是不启动的)

修改/etc/my.cnf:,增加一下内容:

 [mysqld]

 server-id=1

 log-bin=/opt/mysql_backup/date_backup  #可以自己指定

 log-bin-index=/opt/mysql_backup/date_backup.index

 

重启mysql:

 /etc/init.d/mysqld restart

 

这样在/opt/mysql_backup目录下会多出两个文件,一个是date-backup.000001,这个是对mysql进行的所有操作都会纪录在这里,随着log会不断的变大,会产生很多文件(比如 date_backup.000002,date_backup.0000003…..,还有一个文件就是date_backup.index,这个是date_backup.00000x的索引文件.

 

所以增量备份其实就是备份那些date_backup.000000x文件。因为这些文件是二进制的,需要用mysqlbinlog命令来查看。

每次做增量备份前都要做如下动作,来锁定log.

mysql –u root –ppassword –e “flush logs”

然后就可以把date_backup.000000x文件作备份了。

 

恢复时要用到mysqlbinlog命令:

mysqlbinlog date_backup.000001 | mysql –u root -ppassword

 

3.mysqlhotcopy.

  Mysql还提供一种更为快速的备份方法,就是用mysqlhotcopy,功能和mysqldump的功能一样,但是速度更快,因为mysqldump是把数据库转换成文件,而mysqlhotcopy是直接复制数据库目录,中间不做任何转换,所以速度非常快

mysqlhotcopy -u=root -p=password –-addtodest dbname /home/mysql_backup/

 

 

  恢复时只要把目录再copy回去就可以了

cp -rf /home/mysql_backup/dbname /var/lib/mysql/

chown –R mysql:mysql /var/lib/mysql/dbname

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

现在我们就开始实际操作了。

1.我们先要修改mysql的设置。

   修改/etc/my.cnf,添加下面的内容。

  [mysqld]

 server-id=1

 log-bin=/opt/mysql_backup/date_backup

 log-bin-index=/opt/mysql_backup/date_backup.index

   创建所需的目录,然后重启mysql

mkdir -pv /opt/mysql_backup  

chown mysql /opt/mysql_backup

mkdir –pv /home/mysql_backup/{1..12}

/etc/init.d/mysqld restart

 

2. 备份策略:

    每个月的第一天做一个全备份,其余时间做增量备份。数据保留6个月。

 

3. 备份的脚本。

   把下面的脚本在cron中设置,每天晚上2230执行。

 

#!/bin/bash

MY_PASS='12Nm34'

ORIG_DIR='/opt/mysql_backup/'

INDEX_FILE="${ORIG_DIR}/date_backup.index"

BACKUP_DIR='/home/mysql_backup'

DATE=`date +%F`

CURRENT_DAY=`date +%d`

CURRENT_MONTH=`date +%m`

DB="cacti"

 

 

if [ "$CURRENT_DAY" = "01" ]

then

       

   mysqldump -p${MY_PASS} -F -x --databases ${DB} > ${BACKUP_DIR}/${CURRENT_MONTH}/Full_backup_${DATE}  

 

else

 

        LOG_FILE=`find "${ORIG_DIR}" -name "*log*" -type f -cmin -1439`

        echo "$LOG_FILE" > /tmp/mysql.index

      mysql -p${MY_PASS} -e "flush logs" 

        count=0 

        for file in $LOG_FILE

          do

cp $file ${BACKUP_DIR}/${CURRENT_MONTH}/date_backup-${DATE}_${count}

                count=$((count+1))

           done

fi