转义字符导致sqlite迁移至mysql少了15w数据

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

Sqlite迁移至mysql

一、             准备工作

相关sqlite语句 

进入sqlite数据库,如数据库名为mobi.db

[root@localhost ~]# sqlite3 mobi.db

SQLite version 3.6.23.1

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

1)查看数据库

sqlite> .database

seq  name             file                                                     

---  ---------------  ----------------------------------------------------------

0    main             /root/mobi.dbbak                                          

2)查看库里的表

sqlite> .tables

account_alias  devprop        selffund       userdevbind 

accountmap     misc           selfstock      yyblist     

appupdate      qs_qs          sync_queue     yyblist2 

3)查看表结构

sqlite> .schema devprop

CREATE TABLE devprop(

devid varchar(48) primary key,

devprop text,

checksum varchar(16),

update_time varchar(16)

);

 

二、sqlite dump出需要迁移的数据库。

把当前数据库导出文件名为mobi.sql

sqlite>.output mobi.sql

sqlite>.dump

 

三、遇到的第一个问题,mysqlsqlite的表结构新,多了字段

导入mysql数据库语句,并做相关修改

注意:如果你是把最新的mysql表创建语句导入后,请检查该数据库里的表与sqlite里相同的表的字段是否一致,如果不一致先删除掉多余的字段后导数据,删除字段语句:alter table devprop drop column flag;

导完数据后,再加上该字段即可

 

四、遇到的第二个问题,mysql导入里不允许表名以“”引住

[root@localhost ~]# vi  mobi.sql

1)把里面的CREATE TABLE相关语句查找出来去掉

2)删除INTOVALUES之间的引号

sed -i 's/INTO "/INTO /g' mobi.sql && sed -i 's/" VALUES/ VALUES/g' mobi.sql

五、遇到的第三个问题,由于之前的程序开发不严谨居然用户里有转义字符(

INSERT INTO selfstock VALUES('身了Uk\','','1266411514',NULL);

在未处理这\特殊字符之前,mysqlcount出来的selfstock数与sqlite对比少了15w行,由于用户量过大这种错误提示较为难找,我的对比方法是先count看下两数据量是不是一致

不一致时

a)       mysql的日志开启出来(log_bin=mysql-bin开启日志)

b)       过滤相关selfstock 表数据

msyql过滤

mysqlbinlog /var/lib/mysql/mysql-bin.000001 grep selfstock > selfstock.mysql 后面生成的日志追加至selfstock.mysql

   sqlite过滤

grep selfstock mobi.sql > selfstock.sqlite

对比相关数据

diff selfstock.sqlite selfstock.mysql >diff.sql

1.     对比时使用到的shell正则:g/^$/d vi里去除空行,:1,$s/[0-9][0-9a-z]//g vi里去掉diff不必要的数据

mysqlshell情况下导入时\这个转义字符时,须先将其转义:

sed -i 's#\\#\\\\#g' mobi.sql

由于转义字符的原因对比少了15w数据,数据量过大检查并未发现明显错误,于是采用上面的对比方法找出,由于这个问题的出现,刚开始一直以为是乱码问题,搞得莫名其妙。

查看相关数据差异数据,重置mysql日志reset master,查看mysql日志名show binary logs

六、第四个问题mysql插入用户时大小写忽略

由于导出mysql在运行的表结构出来的时候不会保存控制表内容大小写

在建表时时候加以标识

CREATE TABLE devprop(

devid varchar(48) binary primary key,

devprop text,

checksum varchar(16),

update_time varchar(16)

);

 

由于大小写的原因少了70多条数据

 

七、第五个问题,末尾空格用户

上面的问题都解决了之后,发现用户还是少了四条,实在不解于是再次采用对比方法,发现有用户是重名,对于mysql来说,即前面的字符都一样但有个用户后面多了一个或多个空格如下:

INSERT INTO misc VALUES('18970171896 ','','1267243148',NULL);

INSERT INTO misc VALUES('18970171896','','1269091519',NULL);

由于此用户为不合法用户也就没有导入了。

 

 

补充知识及参考资料:

lower_case_table_names=1  mysql默认表名区分大小写,列名不区分,默认值为1

http://firefore.com/2008/01/lower-case-table-names.html

http://www.linuxpig.com/2010/08/mysqlchaxunbuqufendaxiaoxiewentifenxihejiejue/

 

注意事项:需要把使用sqlite数据库的相关程序停止掉

[root@hxmobi-dell mobiauth]#ps aux|grep mobia

root      6303  0.0  0.0   4572  1008 ?        S    Nov20   0:00 sh /root/mobile/mobiauth/mobia.sh

root     16361  0.5  1.4 127884 58060 ?        Sl   Nov22   5:31 obj/mobia -abc

root     19997  0.0  0.0   4004   688 pts/1    S+   10:42   0:00 grep mobia 

[root@hxmobi-dell mobiauth]#kill -9  6303 16361

[root@hxmobi-dell db]# cd /root/mobile/mobiauth/config/db

[root@hxmobi-dell db]# cp mobi.ab mobi.ab-2010-11-23

拷贝完后把原sqlite认证程序启动。让用户可以登录,如果认证程序不停掉操作sqlite数据库,会导致数据损坏问题



本文转自 qwjhq 51CTO博客,原文链接:http://blog.51cto.com/bingdian/420997

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
1月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
4月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
128 0
|
3月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
629 1
|
21天前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
110 10
|
3月前
|
关系型数据库 MySQL 数据库
MySQL数据库上云迁移
本文介绍了将数据库迁移到RDS for Mysql的两种主要方法:停服迁移和不停服迁移。停服迁移适合可短暂中断服务的场景,通过mysqldump或DTS完成;不停服迁移适用于需保持业务连续性的场景,推荐使用DTS实现结构、全量及增量数据迁移。文中详细列出了每种方法的具体操作步骤,帮助企业根据需求选择合适的迁移方案。
MySQL数据库上云迁移
|
2月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
|
5月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
262 28
|
4月前
|
存储 SQL 缓存
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
124 0
|
6月前
|
关系型数据库 MySQL Java
【YashanDB知识库】Kettle迁移MySQL到YashanDB
本文介绍了使用Kettle将MySQL数据库中的中文数据迁移到YashanDB的方法,解决因YMP不支持Latin1字符集导致的乱码问题。提供了Windows和Linux两种环境下的操作步骤,包括配置JAVA环境、解压作业包、设置数据库连接(MySQLInput与YashanOutput)、修改表列表配置文件及运行迁移任务。Windows环境支持图形界面便于调试,Linux环境网络性能更优。通过详细的操作指南,确保数据迁移成功并可重试无冲突。

推荐镜像

更多