动态网站依靠数据库提供实时查询内容,如果数据库不慎被破坏,只能WannaCry,因此做好备份尤为重要。
本文将采用脚本AutoMySQLBackup对MySQL数据库进行定期备份。
主要步骤
安装配置测试AutoMySQLBackup
修改MySQL编码方式
使用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
- æ�®æ�¹æ¨¡å��士ï¼�å��ç�¬è·³è½¬é¡µï¼�å�
容为phpå�¨æ��ç��æ��ï¼�æ� é��æ��å�¨æ¨¡å��士ï¼æ¨¡å�¹ã��
\r\n
- å�®æ�¹æ¨¡å�æ�¹æ¨¡å��å��称ï¼�
\r\n
- ä¸�å�¯å� ®æ�¹æ¨¡å���
\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 |
+-------------------------+
对上述所有表执行下述代码,主要为latin1
→binary
→utf8
。
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开发真是耗时。不过所幸最终在多方资料与尝试中,该问题得到解决,可以去做更有价值的事情了。