GBase 8s 中CLOB的数据迁移
在GBase 8s中可以存储大文本对象CLOB,最大可以支持4T大小。
对于GBase 8s中的CLOB,不同于MySQL中的MediumBlob(最大支持16M),不能通过INSERT方式,直接对记录进行插入操作,因此当一些应用使用CLOB存储配置信息时,可能遇到如何方便的进行数据库部署和初始化数据问题。
由于CLOB的最大值为4T,不能将这么大的数据直接嵌入到SQL语句中(过大的SQL语句可能导致数据库正常运行问题,通常会对SQL语句的大小进行限制),GBase 8s采用了将CLOB数据保存在操作系统的文件中,在执行时,动态从操作系统文件读取数据,并保存在数据库中表的对应字段中。
下面的示例演示如何在GBase 8s中对大文本对象CLOB进行导出和导入。
生成CLOB测试数据
创建演示用的文本文件
[gbasedbt@train ~]$ pwd
/home/gbasedbt
[gbasedbt@train ~]$ mkdir user_doc
[gbasedbt@train ~]$ echo "Hello world" > user_doc/1.txt
[gbasedbt@train ~]$ echo "Happy new year" > user_doc/2.txt
[gbasedbt@train ~]$ echo "Every body" > user_doc/3.txt
[gbasedbt@train ~]$ ls user_doc
1.txt 2.txt 3.txt
[gbasedbt@train ~]$
在上面的操作中,创建了一个user_doc的目录,并创建了三个文件,分别为1.txt,2.txt,3.txt。
创建演示表
[gbasedbt@train ~]$ dbaccess - -
Your evaluation license will expire on 2022-06-09 12:00:00
> database mydb;
Database selected.
> create table t_user1(f_userid int, f_username varchar(20), f_attachment clob) put f_attachment in (sbspace1);
Table created.
> create table t_user2(f_userid int, f_username varchar(20), f_attachment clob) put f_attachment in (sbspace1);
Table created.
> insert into t_user1 values(1, 'tom', filetoclob('user_doc/1.txt', 'client'));
1 row(s) inserted.
> insert into t_user1 values(2, 'mike', filetoclob('user_doc/2.txt', 'client'));
1 row(s) inserted.
> insert into t_user1 values(3, 'rose', filetoclob('user_doc/3.txt', 'client'));
1 row(s) inserted.
> select * from t_user1;
f_userid 1
f_username tom
f_attachment
Hello world
f_userid 2
f_username mike
f_attachment
Happy new year
f_userid 3
f_username rose
f_attachment
Every body
3 row(s) retrieved.
>
从GBase 8s中导出数据
导出用户数据
> !pwd
/home/gbasedbt
> !mkdir user_data
> unload to 'user_data/user1.txt' select f_userid, f_username, null as f_photo from t_user1;
3 row(s) unloaded.
> !cat user_data/user1.txt
1|tom||
2|mike||
3|rose||
>
导出CLOB数据到文件
> !mkdir user_clob
> select lotofile(f_attachment, concat(concat('user_clob/', f_username), '.txt!'), 'client') from t_user1;
(expression) user_clob/tom.txt
(expression) user_clob/mike.txt
(expression) user_clob/rose.txt
3 row(s) retrieved.
> !ls user_clob
mike.txt rose.txt tom.txt
>
注意:在导出文件命名时,要以!进行结尾,不然GBase 8s会自动在文件名后加上后缀,以防止文件重名。
导入数据和CLOB到GBase 8s
导出数据
> load from 'user_data/user1.txt' insert into t_user2;
3 row(s) loaded.
> select * from t_user2;
f_userid 1
f_username tom
f_attachment
f_userid 2
f_username mike
f_attachment
f_userid 3
f_username rose
f_attachment
3 row(s) retrieved.
>
使用文件更新表中CLOB字段
> update t_user2 set f_attachment = filetoclob(concat(concat('user_clob/', f_username), '.txt'), 'client');
3 row(s) updated.
> select * from t_user2;
f_userid 1
f_username tom
f_attachment
Hello world
f_userid 2
f_username mike
f_attachment
Happy new year
f_userid 3
f_username rose
f_attachment
Every body
3 row(s) retrieved.
>