暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

GBase 8s二进制传输协议:Onunload/Onload机制

原创 GBASE数据库 2025-02-21
38

原文链接:https://www.gbase.cn/community/post/5475
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

南大通用GBase 8s 数据库 Onunload 和 Onload 能够以二进制格式快速导出和导入数据,确保数据在不同硬件和数据库版本之间的无缝迁移。Onunload 主要用于将数据库或表的数据导出为二进制格式,而 Onload 则用于将备份的二进制数据重新导入到数据库中。适用于需要快速备份和恢复的场景,例如数据库升级、迁移或灾难恢复。

onunload:二进制卸载

onunload语法:

onunload [-l] [-t <tape_device>] [-b <block size>] [-s <tape size>]
              <db_name>[:[<owner>.]<table_name>]

 

  • tape_device:保存数据的磁带设备。当使用磁盘时,需创建一个空文件并指定。
  • db_name:要导出数据的数据库名称。如果不指定表名称,则导出全库数据。
  • table_name:当需要导出表数据时,指定表名称。

 

说明:

参数b,参数s和参数l主要用于使用磁带设备,当使用磁盘设备时,可以忽略。

导出数据为二进制格式,只能用于兼容硬件上的兼容数据库版本的数据导入。

该方式使用限制较严格,真实场景中使用较少。

onload:二进制装载

onload [-l] [-t <tape_device>] [-b <block size>] [-s <tape size>]
   [-d <data_dbs>] <db_name>[:[<owner>.]<table_name>]
   [{-i <old index name> <new index name>}]
   [{-fd old-DBspace-name new-DBspace-name}]
   [{-fi index-name old-DBspace-name new-DBspace-name}]
   [{-c <old constraint name> <new constraint name>}]

 

  • tape_device:保存数据的磁带设备或操作系统文件目录。
  • data_dbs:指定数据导入时,使用的数据库空间。
  • db_name:指定导入的数据库名称。
  • table_name:指定导入的表名称。

前提

准备好数据库实例;

touch dbs01
chown gbasedbt:gbasedbt dbs01
chmod 660 dbs01
onspaces -c -d dbs01 -p $GBASEDBTDIR/storage/dbs01 -o 0 -s 100000 -k 4

库级别卸载和装载

不带日志数据库的卸载和装载

准备数据

create database testdb in dbs01;
create table t1 (id int,name varchar(20));
create table t2 (id int,name char(20),addr varchar2(20));
insert into t1 values(1,'test');
insert into t1 values(2,'hello');
insert into t2 values(1,'onunloadTest','tianjin');

 

创建用于保存数据的空文件

rm -f testdb.onunload
touch testdb.onunload

 

库级别卸载数据库

echo -e \n | onunload -t testdb.onunload testdb

 

删除数据库

drop database testdb;

 

使用数据文件,装载数据库(指定chunk空间)

#echo -e \n | onload -t testdb.onunload testdb -d dbs01 
/***验证数据*/
#dbaccess testdb –
> select * from t1;
> select * from t2;

 

再次删除数据库,使用数据文件,装载数据库(不指定chunk空间)

# drop database testdb;
#echo -e \n | onload -t testdb.onunload testdb
/***验证数据,此时,数据库testdb存储在rootdbs中,而表数据存储到与原库中表数据存储的pagesize相同的chunk中,即原来表数据存储在4k页中,装载后依然放在4k页的chunk中*/
#dbaccess testdb –
> select * from t1;
> select * from t2;

 

带日志数据库的卸载和装载

准备数据

create database testdb in dbs01 with log;
create table t1 (id int,name varchar(20));
create table t2 (id int,name char(20),addr varchar2(20));
insert into t1 values(1,'test');
insert into t1 values(2,'hello');
insert into t2 values(1,'onunloadTest','tianjin');
//查看
> select * from sysdatabases where name = 'testdb';

name            testdb
partnum         13631490
owner           root
created         2024-12-03
is_logging      1
is_buff_log     0
is_ansi         0
is_nls          1
is_case_insens  0
flags           -12271

1 row(s) retrieved.

>

 

1)创建用于保存数据的空文件

rm -f testdb.onunload
touch testdb.onunload

 

2) 库级别卸载数据库

onunload -t testdb.onunload testdb <<EOF
\n
EOF

 

3) 删除数据库

drop database testdb;

 

4) 使用数据文件,装载数据库(指定chunk空间)

# onload -t testdb.onunload testdb -d dbs01<<EOF
\n
EOF
/***验证数据 带日志的库,卸载后,再装载回去时,变成了无日志的库*/
#dbaccess testdb –
> select * from t1;
> select * from t2;
> database sysmaster;

Database closed.

Database selected.

> select * from sysdatabases where name ='testdb';

name            testdb
partnum         1049056
owner           root
created         2024-12-03
is_logging      0
is_buff_log     0
is_ansi         0
is_nls          1
is_case_insens  0
flags           -12272

1 row(s) retrieved.

>

 

再次删除数据库,使用数据文件,装载数据库(不指定chunk空间)

# drop database testdb;
# onload -t testdb.onunload testdb <<EOF
\n
EOF
/***验证数据,此时,数据库testdb存储在rootdbs中,而表数据存储到与原库中表数据存储的pagesize相同的chunk中,即原来表数据存储在4k页中,装载后依然放在4k页的chunk中
带日志的库,卸载后,再装载回去时,变成了无日志的库
*/
#dbaccess testdb –
> select * from t1;
> select * from t2;
> database sysmaster ;

Database closed.

Database selected.

> select * from sysdatabases where name='testdb';

name            testdb
partnum         13631520
owner           root
created         2024-12-03
is_logging      0
is_buff_log     0
is_ansi         0
is_nls          1
is_case_insens  0
flags           -12272

1 row(s) retrieved.

>

表级别卸载和装载

不带日志数据库中表的卸载和装载

准备数据

create database testdb in dbs01;
create table t1 (id int,name varchar(20));
create table t2 (id int,name char(20),addr varchar2(20));
insert into t1 values(1,'test');
insert into t1 values(2,'hello');
insert into t2 values(1,'onunloadTest','tianjin');

 

创建用于保存数据的空文件

rm -f testdb.onunload
touch testdb.onunload

 

表级别卸载数据库中的表

echo -e \n | onunload -t testdb.onunload testdb:t2

 

删除表

database testdb;
drop table t2;
info tables;

 

使用数据文件,装载数据表(指定chunk空间)

#echo -e \n | onload -t testdb.onunload testdb:t2 -d dbs01 
/***验证数据*/
#dbaccess testdb –
> select * from t2;

 

再次删除数据表,使用数据文件,装载数据库(不指定chunk空间)

# database testdb;
> drop table t2;
> info tables;
# echo -e \n | onload -t testdb.onunload testdb:t2
此时报错:
Your evaluation license will expire on 2025-08-03 00:00:00
Please mount tape and press Return to continue ...Pagesize of the target dbspace does not match with the pagesize of the
partition on tape.
ISAM error: Tape might contain a corrupt page (or) if you are executing onload
command specify the correct DBspace name using the -d argument.

报错原因:原来的表数据存储在4k pagesize的chunk中,如果不指定chunk,默认将表往rootdbs中装载,则报错!

只有在2k页中的表数据,才能使用不指定chunk空间装载!

带日志数据库中表的卸载和装载

准备数据

create database testdb in dbs01 with log;
create table t1 (id int,name varchar(20));
create table t2 (id int,name char(20),addr varchar2(20));
insert into t1 values(1,'test');
insert into t1 values(2,'hello');
insert into t2 values(1,'onunloadTest','tianjin');
--查看
> select * from sysmaster:sysdatabases where name = 'testdb';

name            testdb
partnum         13631552
owner           root
created         2024-12-03
is_logging      1
is_buff_log     0
is_ansi         0
is_nls          1
is_case_insens  0
flags            -12271

1 row(s) retrieved.

>

 

创建用于保存数据的空文件

rm -f testdb.onunload
touch testdb.onunload

 

表级别卸载数据库中的表

echo -e \n | onunload -t testdb.onunload testdb:t2

 

删除表

database testdb;
drop table t2;
info tables;

 

使用数据文件,装载数据表(指定chunk空间)

#echo -e \n | onload -t testdb.onunload testdb:t2 -d dbs01 

      此时报错,表装载失败:

Your evaluation license will expire on 2025-08-03 00:00:00
Please mount tape and press Return to continue ...The database must have logging turned off.

带日志的数据库,不支持表级装载!!!

总之,Onunload 和 Onload通过二进制格式的卸载和装载,数据可以在不同环境之间快速迁移,同时保证了数据的完整性和一致性。然而,在使用过程中,我们也需要注意其限制和潜在问题,例如硬件兼容性和日志数据库的特殊性,掌握它们的使用方法和注意事项,将为您的数据安全提供坚实的保障。

原文链接:https://www.gbase.cn/community/post/5475
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论