Ryan

从MySQL数据库向SQLite迁移
我的一个私人日记站点放在DO,感觉太奢侈了,所以我就转移到以前剁手买的64M VPS上算了,但是装PHP扩展的时候...
扫描右侧二维码阅读全文
03
2015/03

从MySQL数据库向SQLite迁移

我的一个私人日记站点放在DO,感觉太奢侈了,所以我就转移到以前剁手买的64M VPS上算了,但是装PHP扩展的时候忘记加上PHP-MYSQLI了,所以索性用SQLite了,还能省资源。但是找来找去都没有发现什么好的转换工具。于是爬墙上谷歌搜了搜,发现了个神器ESF Database Migration Toolkit - Professional,当然,名字看起来这么高大上的软件是个收费软件,DUANG~加了特技,我们就能免费“试”用了。

当然,如果你想尊重别人的劳动成果你可以购买正版的ESF Database Migration Toolkit - Professional或者使用这个转换脚本

从MySQL导出数据

1、一般人都使用phpMyAdmin来管理数据库,phpMyAdmin是个很方便的数据库管理工具。

使用phpMyAdmin导出MySQL数据库2、在phpMyAdmin选在需要导出的表然后选择导出就可以将数据库导出到本地。

3、如果你没使用phpMyAdmin,则可以使用下面的命令来DUMP(导出)数据库:

tammy@my-laptop:~$ mysqldump -u root -p --compatible=ansi --skip-opt generator > dumpfile

使用ESF Database Migration Toolkit转换MySQL数据库为SQLite数据库

1、ESF Database Migration Toolkit - Professional特别版的下载地址

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

2、下载安装自行解决,不详细说了。

3、打开ESF Database Migration Toolkit - Professional会直接进入向导界面。

4、填写好源数据库信息就可以点下一步继续了,别忘了在phpMyAdmin的界面给相应的用户添加远程访问的权限。

转换MySQL数据库为SQLite数据库01

4、接着选择输出格式,这个软件可支持N种数据库进行互换。

转换MySQL数据库为SQLite数据库02

5、点NEXT继续。选择需要转换的数据表和视图。

转换MySQL数据库为SQLite数据库03

6、点NEXT进入抓换环节,点Submit开始转换,转换完就可以点Exit退出了。

转换MySQL数据库为SQLite数据库04

MySQL转SQLite脚本

    #!/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":stuck_out_tongue_winking_eye:rint;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
	

1、将上边的代码保存为mysql-to-sqlite.sh。

2、在shell中可以直接转换MySQL的dumpfile为SQLite数据库。

tammy@my-laptop:~$ mysql-to-sqlite.sh dumpfile

Sqlite和MySQL的语法差异

1、SQLite标记为Not Null的字段必须非空或指定默认值,否则会报错。(特别注意AUTO_INCEMENT的属性)。

Sqlite和MySQL的语法差异

2、通过UPDATE语句修改数据时不能LIMIT 1

3、更多的我也不知道了。

修改程序代码以适应SQLite数据库

1、由于我使用的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);

2、如果你是使用别的程序误入这里,这里给出几个常见的SQL语句的对应关系,这不是我写的,来自这里

  1. mysql_real_escape_string - sqlite_escape_string
  2. mysql_query - sqlite_query / sqlite_exec
  3. mysql_insert_id - sqlite_last_insert_rowid
  4. mysql_error - sqlite_error_string
  5. mysql_errno - sqlite_last_error
  6. mysql_affected_rows - sqlite_changes

 从MySQL数据库向SQLite迁移小结

1、这是个很小众的迁移方向,相关中文资料我也只找到一篇,最后还是Googling出来好办法的,专业问题还是要Google才行啊。

2、MySQL虽然是很流行,但是确实不是最好的数据库,我们选用数据库的时候不单单要看数据库是否流行,还要看自身的环境,就像32MB,我肯定不可能采用MySQL作为数据库系统。

搬瓦工年付$187机房套餐补货了,电信联通优化,512M内存/500G流量/1G带宽,建站稳定,优惠码:BWH1ZBPVK,【点击购买】!
搬瓦工年付$28CN2高速线路,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快,建站稳定,优惠码同上,【点击购买】!
Last modification:August 20th, 2017 at 08:39 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

13 comments

  1. 爆实惠

    站点手气不错功能设计的好 :idea:

  2. imlonghao

    SQLite 能愉快的并发?

    1. Ryan
      @imlonghao

      不能并发,但是64M的VPS开了SS、PPTP,还要并发不就很勉强?

      1. imlonghao
        @Ryan

        那就是这样了,根本不用考虑这个问题了,64M的话

  3. niuyan

    从来没用过Lite,据说再转出来很困难是吗?

    1. Ryan
      @niuyan

      Sqlite转MySQL网上好多教程啊,不过MySQL转Sqlite的资料只看到一个盗版且不完整的

  4. 同盟源

    厉害啊,第一次听说SQLite,学习了

  5. 若水

    错字了 MySQL虽然是很留行?

    1. niuyan
      @若水

      貌似博主改掉了,我用五笔不可能把IYTF打错的~ :twisted:

    2. Ryan
      @若水

      确实是错字,奇怪的是我的拼音输入法没有这个词啊

  6. 张小三资源网

    技术流。。顶

  7. 互联网电商

    数据库转移写得很详细。

  8. 起飞00后

    沙发 :twisted: