Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148289
  • 博文数量: 22
  • 博客积分: 1745
  • 博客等级: 上尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-14 17:36
文章分类

全部博文(22)

文章存档

2011年(19)

2010年(3)

分类: SQLite/嵌入式数据库

2011-04-13 09:59:05

SQLITE 迁移到 MYSQL
接同事需求,要求从SQLITE的数据转到MYSQL,这东西以前也没接触过。这里搜搜,那里试试,下面把过程列一下。
主要过程分三步:
1,把SQLITE表结构导出来,作一定的格式调整
2,把SQLITE数据导出来,作特殊字符的处理
3,导出MYSQL(注意字符集)
下面是我操作的过程, 有两个部分:单表操作和批量处理(含脚本)

########### 单表操作 ####################
# 打开SQLITE DB
root> sqlite3 mig.db
# 查看表,可用用".help"获得帮助
sqlite>.tables
# 导出数据表结构
sqlite>.output /tmp/heyf/createtable.sql
sqlite>.schema accounts_profile
# 调整建表语句格式, 把双引号去掉,并加上MYSQL的建表约束。
root>sed 's/"/`/g' createtable.sql > create_onmysql.sql
root>sed -i -e 's/^);$/) engine=innodb default charset=utf8;/g' create_onmysql.sql

# 在MYSQL把表建上:
mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < create_onmysql.sql

# 导出数据
sqlite>.mode insert accounts_profile_starred_review_requests
sqlite>.output /tmp/heyf/accounts_profile_starred_review_requests.sql
sqlite>select * from accounts_profile_starred_review_requests;
sqlite>.output stdout
# 处理特殊字符
DOTABLE=accounts_profile_starred_review_requests
cd /tmp/heyf
DOFILE=${DOTABLE}.sql
sed -e "s///g" $DOFILE > ${DOFILE}.new
# 将数据导入MYSQL
mysql -uroot -h127.0.0.1 --default-character-set=utf8 test -e "truncate table ${DOTABLE};"
mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < ${DOFILE}.new


如果表很多:那我们就需要批量处理一下啦,下面是一些批量脚本 :
########### 批量处理 ####################
# 打开SQLITE DB
root> sqlite3 mig.db
# 查看表
sqlite>.tables
# 把所有表名都放入TABLE.LIST文件
# 导出数据表结构
sqlite>.output /tmp/heyf/createtable.sql
sqlite>.schema accounts_profile
sqlite>.schema ... ....
#在MYSQL 创建表结构
root>sed 's/"/`/g' createtable.sql > create_onmysql.sql
root>sed -i -e 's/^);$/) engine=innodb default charset=utf8;/g' create_onmysql.sql
root>mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < /tmp/heyf/create_onmysql.sql
# SQLITE 中导出数据

## 将所有的表生成导出语句(SQLITE)
## cat create_exp.sh
-------------------------
#!/bin/bash
[ $# -ne 1 ] && exit 1
TABFILE=$1
WORKDIR=/tmp/heyf/dmpfile/
OUTFILE=exp.sql
while read LINE
do
echo $LINE
echo ".mode insert $LINE" >> $OUTFILE
echo ".output $WORKDIR/${LINE}.sql ">> $OUTFILE
echo "select * from $LINE ;" >> $OUTFILE
echo ".output stdout " >> $OUTFILE
done < $TABFILE
-------------------------
## 运行后将产生 sqlite 所有表的导出语句
sh create_exp.sh table.list

## 现在进行SQLITE可以将所有表的数据导出来。
sqlite3 /home/admin/foryunfei/heyf.db
.read /tmp/heyf/exp.sql

# 处理特殊字符
## 现在需要将所有的SQL文件中的""替换成”“,以使SQL能正确执行
## cat replace.sh
-------------------------
#!/bin/bash
[ $# -ne 1 ] && exit 1
TABFILE=$1
WORKDIR=/tmp/heyf/dmpfile/
while read DOTABLE
do
cd $WORKDIR
DOFILE=${DOTABLE}.sql
sed -e "s///g" $DOFILE > ${DOFILE}.new
done < $TABFILE
-------------------------
## sh replace.sh table.list
## 将数据导入MYSQL
## cat imp.sh
-------------------------
#!/bin/bash
[ $# -ne 1 ] && exit 1
TABFILE=$1
WORKDIR=/tmp/heyf/dmpfile/
while read DOTABLE
do
cd $WORKDIR
mysql -uroot -h127.0.0.1 --default-character-set=utf8 test -e "truncate table ${DOTABLE};"
mysql -uroot -h127.0.0.1 --default-character-set=utf8 test < ${DOTABLE}.sql.new
done < $TABFILE
-------------------------
## sh imp.sh
阅读(8359) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~