用AutoMySQLBackup对网站MySQL数据库进行备份(含中文乱码解决方案)

动态网站依靠数据库提供实时查询内容,如果数据库不慎被破坏,只能WannaCry,因此做好备份尤为重要。
本文将采用脚本AutoMySQLBackup对MySQL数据库进行定期备份。

用AutoMySQLBackup对网站MySQL数据库进行备份(含中文乱码解决方案)_第1张图片
最心酸的放弃开发声明/NoPingWest

主要步骤

  1. 安装配置测试AutoMySQLBackup

  2. 修改MySQL编码方式

  3. 使用crontab实现定时执行AutoMySQLBackup

环境

CentOS 6.5 + MySQL 5.1.73

1. 安装配置测试AutoMySQLBackup

1.1 安装AutoMySQLBackup

在Terminal中执行,下载最新脚本:

wget http://downloads.sourceforge.net/project/automysqlbackup/AutoMySQLBackup/AutoMySQLBackup%20VER%203.0/automysqlbackup-v3.0_rc6.tar.gz

下载完毕后,解压下载文件到指定目录:

mkdir /opt/automysqlbackup
tar zxvf automysqlbackup-v3.0_rc6.tar.gz -C /opt/automysqlbackup`

解压完毕后,执行install.sh安装脚本:

cd /opt/automysqlbackup
./install.sh

安装过程如下:

### Checking archive files for existence, readability and integrity.

automysqlbackup ... exists and is readable ... md5sum okay :)
automysqlbackup.conf ... exists and is readable ... md5sum okay :)
README ... exists and is readable ... md5sum okay :)
LICENSE ... exists and is readable ... md5sum okay :)

Select the global configuration directory [/etc/automysqlbackup]: ### 回车选择默认值
Select directory for the executable [/usr/local/bin]: ### 回车选择默认值
### Creating global configuration directory /etc/automysqlbackup: ### 回车选择默认值

success
  • 参考:How to install and configure AutoMySQLBackup - RoseHosting

1.2 配置AutoMySQLBackup

打开automysqlbackup.conf配置文件,对下述参数进行配置,主要分为登录设置、备份设置、备份周期及保留时间设置及邮件通知设置4部分。

1.2.1 登录设置

# Username to access the MySQL server e.g. dbuser
CONFIG_mysql_dump_username='你的数据库用户名'

# Password to access the MySQL server e.g. password
CONFIG_mysql_dump_password='你的数据库密码'

# Host name (or IP address) of MySQL server e.g localhost
#CONFIG_mysql_dump_host='localhost'

1.2.2 备份设置

# Backup directory location e.g /backups
CONFIG_backup_dir='/var/my-backup/my-db'

# Databases to backup

# List of databases for Daily/Weekly Backup e.g. ( 'DB1' 'DB2' 'DB3' ... )
# set to (), i.e. empty, if you want to backup all databases
CONFIG_db_names=()

1.2.3 备份周期及保留时间设置

# Which day do you want monthly backups? (01 to 31)
# If the chosen day is greater than the last day of the month, it will be done
# on the last day of the month.
# Set to 0 to disable monthly backups.
CONFIG_do_monthly="01"

# Which day do you want weekly backups? (1 to 7 where 1 is Monday)
# Set to 0 to disable weekly backups.
CONFIG_do_weekly="5"

# Set rotation of daily backups. VALUE*24hours
# If you want to keep only today's backups, you could choose 1, i.e. everything older than 24hours will be removed.
CONFIG_rotation_daily=6

# Set rotation for weekly backups. VALUE*24hours
CONFIG_rotation_weekly=35

# Set rotation for monthly backups. VALUE*24hours
CONFIG_rotation_monthly=150

1.2.4 邮件通知设置


# Notification setup

# What would you like to be mailed to you?
# - log   : send only log file
# - files : send log file and sql files as attachments (see docs)
# - stdout : will simply output the log to the screen if run manually.
# - quiet : Only send logs if an error occurs to the MAILADDR.
CONFIG_mailcontent='log'

# Email Address to send mail to? ([email protected])
CONFIG_mail_address='你的邮箱'

1.3 测试AutoMySQLBackup

至此,安装配置工作结束,可以开始感受备份效果如何。

在测试前,需要根据刚才设置的备份路径(‘/var/my-backup/my-db’),在系统中新建根路径。

mkdir /var/my-backup

接下来,在Terminal中执行命令:

automysqlbackup "/opt/automysqlbackup/automysqlbackup.conf"

在备份路径下,就可以看到新建文件夹,存储着生成数据库的sql文件。

注意:很多文章都只执行了automysqlbackup部分,未跟配置文件路径。然而在本例中会出现报错:

[root]# automysqlbackup
Invoking backup method.

Parsed config file "/etc/automysqlbackup/automysqlbackup.conf"

# Checking for permissions to write to folders:
base folder /var/backup ... does not exist. Exiting.
Note: Supplied more than one argument, ignoring ALL arguments - using default and global config file only.
Error: No basedir found, i.e.
/usr/local/bin/automysqlbackup: line 835: 6: Bad file descriptor
/usr/local/bin/automysqlbackup: line 836: 7: Bad file descriptor
Skipping normal output methods, since the program exited before any log files could be created.

错误主要集中在base folder /var/backup ... does not exist. Exiting.这一行。由于automysqlbackup命令文件中设定了配置参数的默认值,其中存储路径默认值为/var/backup/db,由于我们定义的路径为'/var/my-backup/my-db',这样看来单独运行automysqlbackup命令,并未按照配置文件的参数运行,因此需要跟上配置文件路径,要求其按配置参数运行,这样就没有问题了。

2. 修改MySQL编码方式

至此,一切看来没有问题,数据库都能如愿备份到本地文件夹。然而,当打开备份sql文件时,揪心的事情便来临了:

LOCK TABLES `modules_table` WRITE;
/*!40000 ALTER TABLE `modules_table` DISABLE KEYS */;
INSERT INTO `modules_table` VALUES (30,2,'ç»�å�
��','2016-11-01 04:11:13',
'

说æ�®æ¨¡å��士ï¼å�

\r\n\r\n
    \r\n
  1. æ�®æ�¹æ¨¡å��士ï¼�å��ç�¬è·³è½¬é¡µï¼�å� 容为phpå�¨æ��ç��æ��ï¼�æ� é��æ��å�¨æ¨¡å��士ï¼æ¨¡å�¹ã��
  2. \r\n
  3. å�®æ�¹æ¨¡å�æ�¹æ¨¡å��å��称ï¼�
  4. \r\n
  5. ä¸�å�¯å� ®æ�¹æ¨¡å���
  6. \r\n
\r\n','members'), (31,2,'å� å ¥æ��们','2017-05-19 16:07:42', '

\r\n\r\n

A. æµ·å®æ�¹æ¨¡å��士ï¼�1®æ�¹¨¡å��士ï¼�å��ï¼�

汉字全变成乱码了,这样的备份还叫备份吗。因此,需要想办法纠正编码。
乱码的原因主要是,MySQL数据库的默认编码为latin1(官方名称ISO/IEC 8859-1),该编码是可以存储汉字的。
关于这一点,这篇博文有如下解释:

因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

因此,数据库尽管默认使用Latin1,是可以存储显示中文,但备份导出还是出问题了。因此,一劳永逸的方案就是对数据库转变编码方式,转为UTF-8。

数据库转码网络上提到各种各样的方法,尝试了各种后,目前总结出最可行的一个流程。

2.1 建立数据库副本以防万一

这一点非常重要!按照下列代码,创建副本。
在Terminal导出当前数据库:

mysqldump -uroot -p DATABASE_NAME -r dump.sql
mysql -uroot -p

在MySQL命令行中新建副本数据库

-- 创建副本数据库
CREATE DATABASE DATABASE_NAME_COPY;
-- 切换到副本数据库     
USE DATABASE_NAME_COPY;  
-- 执行sql脚本,创建内容
SOURCE dump.sql;

2.2 重新设置数据库编码方式

在Terminal中运行

mysql -u你的数据库用户名 -p

输入数据库密码,进入MySQL命令行,切换数据库到需要转码的数据库

USE DATABASE_NAME;

首先,查看一下当前数据库的编码参数:

SHOW VARIABLES LIKE "%CHARACTER%";

返回结果如下:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | latin1                     |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

确实,数据库编码为latin1,现在需要将上面所有的latin1设置为utf8(不是utf-8)。方法很简单,用SET实现(character_set_filesystem的取值不变):

SET character_set_client     = 'utf8'
SET character_set_connection = 'utf8'
SET character_set_database   = 'utf8'
SET character_set_results    = 'utf8'
SET character_set_server     = 'utf8'
SET character_set_system     = 'utf8'
SET character_sets_dir       = 'utf8'

参考:设置MYSQL数据库编码为UTF-8-开源中国社区

2.3 更新现有数据的编码

上一步实现了数据库编码的重新设置,但已有数据的格式仍未改变,需要手动更新。

首先,查看数据库有哪些表:

mysql> SHOW TABLES;
+-------------------------+
| Tables_in_my_database   |
+-------------------------+
| articles_table          |
| coverNews_table         |
| faculty_table           |
| modules_table           |
| shortNews_table         |
| student_table           |
+-------------------------+

对上述所有表执行下述代码,主要为latin1binaryutf8

alter table articles_table convert to character set binary;
alter table coverNews_table convert to character set binary;
alter table faculty_table convert to character set binary;
alter table modules_table convert to character set binary;
alter table shortNews_table convert to character set binary;
alter table student_table convert to character set binary;

alter table articles_table convert to character set utf8 COLLATE utf8_general_ci;
alter table coverNews_table convert to character set utf8 COLLATE utf8_general_ci;
alter table faculty_table convert to character set utf8 COLLATE utf8_general_ci;
alter table modules_table convert to character set utf8 COLLATE utf8_general_ci;
alter table shortNews_table convert to character set utf8 COLLATE utf8_general_ci;
alter table student_table convert to character set utf8 COLLATE utf8_general_ci;

至此,数据库编码和数据自身编码都更新为UTF8

2.4 AutoMySQLBackup的OPT修改

其实,AutoMySQLBackup核心使用的是MySQL的数据库导入导出程序mysqldump,该程序可以传入编码参数,为了稳妥可以为设置该参数。

由于,AutoMySQLBackup.conf文件并未提供导出编码设置,需要直接对AutoMySQLBackup文件进行修改。
打开该文件,找到下述行:

parse_configuration () {
    # OPT string for use with mysqldump ( see man mysqldump )
    opt=( '--quote-names' '--opt' )

    # OPT string for use with mysql (see man mysql )
    mysql_opt=()

    # OPT string for use with mysqldump fullschema
    opt_fullschema=( '--all-databases' '--routines' '--no-data' )

    # OPT string for use with mysqlstatus
    opt_dbstatus=( '--status'  )

在三处指定编码参数'--default-character-set=utf8'

parse_configuration () {
    # OPT string for use with mysqldump ( see man mysqldump )
    opt=( '--quote-names' '--opt' '--default-character-set=utf8' )

    # OPT string for use with mysql (see man mysql )
    mysql_opt=()

    # OPT string for use with mysqldump fullschema
    opt_fullschema=( '--all-databases' '--routines' '--no-data'  '--default-character-set=utf8' )

    # OPT string for use with mysqlstatus
    opt_dbstatus=( '--status'  '--default-character-set=utf8' )

至此,编码问题总算告结,需要重启MySQL服务。

在Terminal中执行

/etc/init.d/mysqld restart

3. 使用crontab实现定时执行AutoMySQLBackup

最后一点,自动执行AutoMySQLBackup非常重要。
实现方法,依靠系统自带的crontab实现,它可以实现对制定程序的定时运行(其中cron命名取自希腊语词根“chronos, Χρόνος”,表示“时间”,tab是table的简称,因此就是时间表、计划表的意思)。

crontab是一个文件,在/etc/crontab路径可以找到。打开后写入如下内容便可以实现定时工作:

# MySQL Daily Backup
0 0 * * * root /opt/automysqlbackup/automysqlbackup "/opt/automysqlbackup/automysqlbackup.conf"

其中0 0 * * *分别对应minute (0 - 59)hour (0 - 23)day of month (1 - 31)month (1 - 12) OR jan,feb,mar,apr ...以及day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat,需要指定的写上具体值,不需要指定的用*表示。该设置表示每天的零点执行备份。

此外,root为系统用户名,其后跟执行命令。

4. 结束语

至此,备份文件仍旧存在本地,当然上传到远程才是真正安全,然而这非本文目的,在此不再赘述。

一个简单的备份,也会出现这么多岔子,web开发真是耗时。不过所幸最终在多方资料与尝试中,该问题得到解决,可以去做更有价值的事情了。

你可能感兴趣的:(用AutoMySQLBackup对网站MySQL数据库进行备份(含中文乱码解决方案))