项目场景
需要将数据库从MySQL迁移到 vastbase(海量数据库),然后遇到大大小小的bug,有些搜索半天,在此统一记录下;
1 Navicat 登录失败:提示到期的用户
提示:修改到期的用户xxxx的密码:
此时其实用idea的数据库连接或者VDS(海量数据库自己的连接工具)是可以连的;
不用 执行 该命令,需登录 xxxx 账号,然后使用xxx账号执行命令:
ALTER ROLE xxxx IDENTIFIED BY 'password' REPLACE 'old password';
2 登录失败:账户被锁定
提示:登录次数过多或者密码错误过多,账户被锁定:
由于程序会不停尝试连接数据库,所以改密码前最好将程序停掉;
账号被锁定后,需要使用管理员或者以上角色的账号执行解封sql:
alter user xxxx account unlock;
3 数据库结构迁移
由于两者表结构不一样,需要表和数据分开同步
3.1 表迁移
先将MySQL库单独复制一份纯表结构的库,方便同步:
先导出表结构,然后在MySQL新库执行sql文件
然后新建个备用库执行sql
在
vastbase
新建一个数据库:
由于Navicat新建数据库没兼容模式选项,这里使用sql建库,账号需有建库权限;
创建库时需指定 DBCOMPATIBILITY = 'B'
将数据库兼容模式改为MySQL
默认是A兼容的Oracle
:
CREATE DATABASE db_test
WITH
OWNER = test
ENCODING = 'UTF-8'
TEMPLATE = "template0"
DBCOMPATIBILITY = 'B'
TABLESPACE = pg_default
LC_COLLATE = 'POSIX'
LC_CTYPE = 'POSIX'
CONNECTION LIMIT = -1
PAD_ATTRIBUTE = 'N' ;
从复制的表
数据同步
到vastbase
:
选择数据传输:
从mysql
传输到vastbase
:
选择全部表下一步,
然后勾选上遇到错误时继续
,
点击开始
按钮开始同步表结构;
3.2 默认值迁移
同步到vastbase后无默认值,需要额外执行sql
生成sql
在mysql
中运行sql获取所有的默认值:
SELECT concat('ALTER TABLE \"public\".\"',TABLE_NAME , '\" alter column \"',COLUMN_NAME,'\" set DEFAULT ',IF(data_type='varchar',concat('\'',COLUMN_DEFAULT,'\''),COLUMN_DEFAULT),';')
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'db_test_b' AND COLUMN_DEFAULT is not null;
然后将生成的结果在vastbase
中执行;
注意:该sql只兼容了 varchar 的字符串,如果执行报错自己手动在该行上加 ‘’ 引号后接着执行。
3.3 自增主键迁移
同步到vastbase后无自增主键,需要额外执行sql以添加自增主键
官方推荐的方法我在使用时频繁报错;若该方法对您有效,建议直接采用:
-- 建表时自增
CREATE TABLE test1(auto_id int primary key AUTO_INCREMENT, b int);
-- 修改为自增
ALTER TABLE "test1" modify "auto_id" int AUTO_INCREMENT;
-- 修改当前值
ALTER TABLE test1auto_increment = 998;
下面是我自己实际项目中同步的方式:
从
MySQL
数据库中获取需要修改为自增的主键,将生成的sql在vastbase
中执行:
SELECT concat('CREATE SEQUENCE ',TABLE_NAME , '_auto_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999999 START WITH 1 CACHE 1;',
'ALTER TABLE public.',TABLE_NAME,' ALTER COLUMN "',COLUMN_NAME,'" SET DEFAULT nextval(''',TABLE_NAME , '_auto_seq''::regclass);',
'ALTER SEQUENCE public.',TABLE_NAME,'_auto_seq OWNED BY public.',TABLE_NAME,'.',COLUMN_NAME,';')
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'db_test_b' AND EXTRA = 'auto_increment';
从
MySQL
数据库中获取自增主键当前值,将生成的sql在vastbase
中执行:
SELECT concat('ALTER TABLE ',TABLE_NAME , ' auto_increment = ',auto_increment,';')
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'd412' AND auto_increment is not null;
结束语
没迁移工具真TM难整,一整就是一天