By烟花易冷

Typecho从MySQL数据库转SQLite数据库
2015-03-15

偶然间在苹果树下看到有这么一篇好文章,果断整理了一下,Mark啦。平时说实话虽然Typecho支持更加轻快sqlite数据库,但是为了方便搬家我还是选择了使用mysql数据库,而mysql数据库对于我这种喜欢买小内存低配置VPS(其实是贵的开销不起)的人来说,想要在VPS上面抛弃了还真的费力气,而现在有了这篇文章顿时拨云见日了,下面分享一下整理好的MySQL数据库转SQLite数据库过程吧。

一、MySQL数据的导出如果是一般的空间,通常使用phpMyAdmin来管理数据库,将typecho的数据库导出。
mysql_to_sqlite_migration_via_sqlitemanager_01-600x352

如果是LinuxVPS,除了phpMyAdmin之外你还可以选择直接使用linux命令导出,命令如下:

mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile

二、数据的转换如果是采用第一种方法导出的,您可以使用 ESF Database Migration Toolkit – Professional进行转换,下载地址:

http://pan.baidu.com/s/1eQH3jJc

如果是采用linux vps直接导出文件来的方法,你可以尝试一下使用如下脚本:

#!/bin/bash
if [ "x$1" == "x" ]; then
  echo "Usage: $0 "
  exit
fi
cat $1 |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
grep -v ' PRIMARY KEY ' |
sed '/^SET/d' |
sed 's/ unsigned / /g' |
sed 's/ auto_increment/ primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
  $a=$1;
  s/\\'\''/'\'\''/g;
  s/\\n/\n/g;
  s/\),\(/\);\n$a\(/g;
}
' > $1.sql
cat $1.sql | sqlite3 $1.db > $1.err
ERRORS=`cat $1.err | wc -l`
if [ $ERRORS == 0 ]; then
  echo "Conversion completed without error. Output file: $1.db"
  rm $1.sql
  rm $1.err
else
  echo "There were errors during conversion.  Please review $1.err and $1.sql for details."
fi

三、修改typecho的配置文件以改用sqlite打开配置文件config.inc.php,我们可以看到原来MySQL的配置如下:

$db = new Typecho_Db('Mysql', 'typecho_');
$db->addServer(array (
  'host' => 'localhost',
  'user' => '***',
  'password' => '***',
  'charset' => 'utf8',
  'port' => '3306',
  'database' => '***',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

修改为下面这样的就可以了(如果是SQLite3请将Sqlite关键字修改为Pdo_SQLite)

$db = new Typecho_Db('SQLite', 'typecho_');
$db->addServer(array (
  'file' => '***',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

到此这个过程就结束了,快来好好感受一把sqlite的轻快吧,学会这招以后就方便多了~


本文核心内容参考苹果树下,转载请注明本文链接!最近还在慢慢优化我的Y4CMS主题,也就是你正看到的这个,一步一步越来越顺手啦~