原文链接: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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。