我的新网站放在一台香港的VPS上,采用我以前介绍过的lnmp一键安装包安装的服务器环境。但是有一个问题,就是安装好的MySQL默认采用innodb引擎,对于我们这种小网站而言,无疑会给服务器造成巨大的压力,但最最令我烦恼的,是MySQL在运行一段时间后,开始出现宕机情况,现象是mysql.pid文件丢失。如果登录到服务器查看netstat -nptl,发现不存在mysql服务,于是重启服务,结果在重启的过程中提示不存在进程pid文件。
可以大致判断,MySQL的innodb导致了这个问题的产生,因为innodb引擎的特殊处理方式,会在MySQL进程中更多的利用资源。当然,如果机器性能OK的话,采用innodb可以带来更多好处,但是对于机器性能很渣的我,只能选择放弃使用innodb,而重新采用MyISAM引擎。
不过,在切换引擎的过程中,会遇到非常严重的问题:innodb产生的数据库文件将无法再MyISAM引擎下被识别。所以当切换成innodb之后,MySQL是无法重启的,或者就算重启,也不能正确读取原有的数据库表。
因此,如果你想解决这个问题,可以按照本文的方法操作。
两种选择:在开始之前就行动
最好的行动方式是在所有事情发生之前就去执行,在你安装完环境之后,就按照本文的方式去做,将有助于你产生更少的烦恼。
但是,也有可能你不幸的在运行了很久的服务器之后,才发现这个问题,所以也不得不绕一下远路。
使用sql备份数据库
虽然在系统中,数据库其实是以文件的形式保存的,可以通过复制文件来实现数据库的转移。但是因为上面所说的,两种引擎无法相互识别,所以最好的解决办法,是先导出sql,待切换成功之后,导入sql恢复数据库。当然,这仅限于数据量小的时候,如果数据量大……你不可能切换引擎。
开始行动
接下来,就是你要做的事情,按照步骤一步一步的去做。
1. 停止正在运行的MySQL
2. 备份相关文件
你需要备份的文件有如下列表,以防在未来你可能恢复它们。
/etc/my.cnf/usr/local/mysql/var ## 运行目录,这是lnmp默认的MySQL路径,你需要根据你的情况备份,lnmp把所有的数据,运行时文件都放在这个目录了,不推荐这种
/usr/local/mysql/data ## 我喜欢把所有的数据库放在这个目录,你根据你的情况,备份数据库
上面var和data实际上我们需要的,是备份数据库,或者有可能涉及一些mysql的东西。总之,你要能确保能恢复到修改之前的状态。
3. 修改my.cnf
修改/etc/my.cnf文件,直接全部替换吧:
[client] port = 3306socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock datadir = /usr/local/mysql/data pid-file = /usr/local/mysql/var/mysqld.pid log-error = /usr/local/mysql/var/mysqld-error.log skip-external-locking key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M thread_cache_size = 8 query_cache_size = 8M tmp_table_size = 16M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 log-bin = mysql-binbin log_format = mixed server-id = 1 expire_logs_days = 10 innodb=OFF loose-innodb-trx=0 loose-innodb-locks=0 loose-innodb-lock-waits=0 loose-innodb-cmp=0 loose-innodb-cmp-per-index=0 loose-innodb-cmp-per-index-reset=0 loose-innodb-cmp-reset=0 loose-innodb-cmpmem=0 loose-innodb-cmpmem-reset=0 loose-innodb-buffer-page=0 loose-innodb-buffer-page-lru=0 loose-innodb-buffer-pool-stats=0 loose-innodb-metrics=0 loose-innodb-ft-default-stopword=0 loose-innodb-ft-inserted=0 loose-innodb-ft-deleted=0 loose-innodb-ft-being-deleted=0 loose-innodb-ft-config=0 loose-innodb-ft-index-cache=0 loose-innodb-ft-index-table=0 loose-innodb-sys-tables=0 loose-innodb-sys-tablestats=0 loose-innodb-sys-indexes=0 loose-innodb-sys-columns=0 loose-innodb-sys-fields=0 loose-innodb-sys-foreign=0 loose-innodb-sys-foreign-cols=0 default-storage-engine=MyISAM default_tmp_storage_engine=MyISAM [mysqldump] quickmax_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
上面那些具体的值可以根据你的机器的内存和cpu做调整。这是我的机器的配置,1G内存1核。
注:上面的这个配置禁用了Innodb,使得默认引擎是MyISAM。
4. sql备份数据
5. 搬迁mysql的核心数据库
mysql拥有两个核心的数据库,分别是mysql和performance_schema这两个库,它们保存了mysql基本的一些设置和一些结构。
注意:如果你启用了pma__相关的功能,千万要小心,因为这些表里面记录了原有的数据库相关信息,你需要在这个步骤之前进入phpmyadmin,备份完数据之后,删除所有自己创建的数据库,恢复mysql初始化的时候的样子。
把原来的var/mysql、var/performance_schema直接复制到data目录中(data目录是新创建的,所以是空的)。另外,data目录还需要有mysql用户的可写权限。
在data目录中创建一个mysql-bin.index空文件,同样要给mysql用户可写权限。
这样,在data中就有两个文件夹和一个空文件。
6. 重启mysql
sudo service mysql restart
7. 检查错误
如果能够重启的话,就算成功了,如果没有成功,则可以在var/mysqld-error.log文件里面找到错误原因。根据这些错误原因进行调整,如果实在不知道怎么办,也可以把这些错误原因贴到社区,寻求大神帮忙。
8. 恢复数据
登录到phpmyadmin,创建原来的数据库,导入刚才备份的sql文件。
总结
上面的步骤里面,最核心的有两个点,一是配置文件的内容,相当于通过配置文件实现引擎切换;二是数据库的备份和转移,这里看上去挺轻松,但实际上,转移数据库过程里面各种兼容性问题还是比较复杂的。
2016-09-01 6813 Innodb
[…] 补充:在开始运行网站之前,还有一个建议,就是阅读一下《在开始之前就最小化你的MySQL》,如果你也和我一样,是为小型网站准备,就可以尝试这种方法,如果是土豪用户,则可以忽略。 […]