公司的项目管理服务器莫名奇妙的就启动失败了,具体是什么问题我也不知道了,现在需要做的就是尽快的把服务恢复了,好了,开始动手了。


好在是操作系统没出什么问题,还能进得去,windows 2003 的服务器,里面装的是 bitnami 打包的 redmine 项目管理软件,安装采用的是 bitnami 打包好的非常方便的安装包安装的,里面集成了 apache、 mysql、rails、subversion 和一个很方便的启动管理器。不过,我估计安装的时间已经相当长了,因为使用的 rails 还是 2.3 这样的老版本,而且长期的使用也没有备份过任何的数据。


这样的老系统最头痛的地方是没有使用 utf8 的编码格式,而现在的系统都是 utf8 的,所以,在这一点上浪费了一点时间。不过,唯一值得庆幸的是,mysql 开启了二制日志记录。


一、日志文件恢复成 sql


真得什么都找不到了,数据库没有了,mysql 也没有了,只发现了几十个像 mysql-bin.000001 这样的二进制 mysql 日志文件,看来也只能从这些日志文件里恢复。我把所有的这些日志文件拷贝到一台干净的 windows 2003 上面,这台 Server 上面已经安装了 mysql, 使用命令:


C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqlbinlog.exe "c:\Program Files\My SQL\MySQL Server 5.6\data\mysql-bin.000001" > C:\000001.sql


一个一个的生成一系列 sql 文件。


二、检查 sql 的编码


这里,我需要检查一下这些文件的编码格式,因为以前用的老版本的 redmine 并不是支持国际编码 utf8 格式的,使用的是 latin1 这种编码,我要看看在 utf8 下能不能看到以前 sql 语句中的中文正常的显示,以确定是 utf8 编码的 sql文件。


将其中一个有中文的 sql 文件拖到 IE 中,把编码改 utf8 看看里面的中文是不是能看懂的,不是乱码就行了。如果是乱码的化,你就需要使用一些转码工具来完成编码的转换。还好,这些 sql 文件是 utf8的。


三、删除 sql 中的指定编码项


开始把日志导完后,才发现中文又变成了乱码,几经检查后发现,发现需要把每个 sql 文件中的指定的编码内容删除才行,比如下面的,我把每个文件中的 at 98 日志项全删掉了,导入的日志才不会变乱。


# at 98
#130217  9:26:06 server id 1  end_log_pos 217 Querythread_id=1exec_time=0error_code=0
SET TIMESTAMP=1361064366/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;


你觉得麻烦的话,也可以设置 mysqlbinlog 的 --start-position 来不使用这些内容。


四、导入日志


准备一台干净的 Server ,我用的是从 bitnami 下载的 ubuntu 12.04 的服务,下载好的文件直接可以使用 vmware 打开并使用的。将这些文件传到这台 Linux Server 上(我用的是 SCP),然后使用命令:


$ mysql -u root -p


输入密码后,进行 mysql 管理控制台,查看一下数据库的编码格式是不是支持 utf8 的,一般来说默认是这样的:


mysql> use bitnami_redmine;
mysql> show variables like 'character_set_%';
+--------------------------+------------------------------------+
| Variable_name            | Value                              |
+--------------------------+------------------------------------+
| character_set_client     | utf8                               |
| character_set_connection | utf8                               |
| character_set_database   | utf8                               |
| character_set_filesystem | binary                             |
| character_set_results    | utf8                               |
| character_set_server     | utf8                               |
| character_set_system     | utf8                               |
| character_sets_dir       | /opt/bitnami/mysql/share/charsets/ |
+--------------------------+------------------------------------+
8 rows in set (0.01 sec)


好了,去导入数据吧,我是从第 3 个日志文件开始导入的,因为前两个日志文是安装的时候用于生成数据库、数据表和一些基本信息的,不用导入。使用命令:


mysql> source 000003.sql


后面的命令也是一样的,一直导入完就行了,你所有的数据就进了数据库中。


五、最后关于 redmine 的处理


导入完成后,你应该可以使用 redmine ,但我这里还不行,登陆不进系统,使用 phpmyadmin 查看数据都是正常的。为什么呢?这是因为新版的 redmine 为了安全保存密码,加入了一个 salt 的随机数,用于将 hashed_password 的安全性提高,不至于直接就可以通过网站查询到SHA 加密过的密码。使用命令:


bitnami@linux:/opt/bitnami/apps/redmine/htdocs$ rails console product


进入 rails console 控制台,可以看到你正在使用的是生产环境:


irb(main):001:0> Rails.env
=> "production"
irb(main):002:0> User.salt_unsalted_passwords!


这样就搞定了。好了,你现在可以正常的使用新版的 redmine,别忘了你以前的上传的文档复制到 /opt/bitnami/apps/redmine/htdocs/files 文件下。


其它:


1. 为什么这么麻烦,你会说不如直接把日志文件复制出来后导入到数据库中呢?

不行的,主要是编码问题,导进去后中文字就变在乱码了。


2. 以后备份数据库可以使用命令

bitnami@linux:~$ mysqldump -u root -p bitnami_redmine > 130710back.sql