首页 > 把oracle的中数据通过批处理导入sqlite中

把oracle的中数据通过批处理导入sqlite中

想把oracle数据库中的数据(5张表,总共数据20W条左右)通过批处理导入到sqlite中去,这个批处理该怎么写呢?


首先推荐一个开源跨平台的SQLite图形化管理工具SQLiteStudio:
http://sqlitestudio.pl
用SQLiteStudio建5张等价于你Oracle里的那5张数据表.然后在CLI下用PHP的oci8扩展函数SELECT读取整张表数据,然后用PDO_SQLite开启事务,批量插入数据到SQLite数据库中.

注意CLI下运行的PHP脚本也是有内存限制(memory_limit)的,php.ini中设为-1,则表示不限制内存占用:
http://php.net/manual/zh/ini.core.php#ini.memory-limit
还有,保证你的机器内存能容纳20W数据(不算多),PHP7的数组更省内存,你也可以尝试使用PHP7进行操作,PHP7已经发布预览版RC1.CLI下操作完后不用的变量和数组记得unset释放掉内存.

<?php
$table = 'CREATE TABLE logs (
    id       INTEGER PRIMARY KEY,
    date     VARCHAR(19) NOT NULL,
    content  VARCHAR(200) NOT NULL
)';
if (!file_exists('data.db3')) {
    $dbh = new PDO('sqlite:data.db3');
    $dbh->query($table);
} else {
    $dbh = new PDO('sqlite:data.db3');
}
$date = date('Y-m-d H:i:s');
$content = time();
$dbh->beginTransaction();
for($i=0;$i<1000000;$i++) {
    $stmt = $dbh->prepare('INSERT INTO logs (date, content) VALUES (:date, :content)');
    $stmt->bindParam(':date', $date, PDO::PARAM_STR, 19);
    $stmt->bindParam(':content', $content,  PDO::PARAM_STR, 200);
    $stmt->execute();
}
$dbh->commit();
$dbh = null;

Ubuntu(i5-3230M),开启事务时,PHP往SQLite插入100万条记录只用16秒,平均每秒插入62500条.期间会产生一个临时文件data.db3-journal,该文件主要用于SQLite事务回滚,在事务开始时产生,在事务结束时删除.当程序发生崩溃或者系统断电时该文件将留在磁盘上,以便下次程序运行时进行事务回滚.因为会在当前目录下产生临时文件data.db3-journal,所以需要保证PHP具有对该目录的写权限.


ETL kettle 可行否

【热门文章】
【热门文章】