1、背景
随着数据库国产化的不断深入,数据库对数据的备份、恢复操作至关重要。在梧桐云原生分析型数据库管理中,备份是保障数据安全和可用性的基础,而恢复则是应对意外数据丢失或系统崩溃的关键步骤。备份对于数据库非常重要,可以保护数据的长期完整性和安全性。
2、备份和恢复必要性
2.1 防止数据丢失
备份能够防止误操作、硬件故障、网络攻击、自然灾害等意外情况导致数据丢失。
2.2 数据恢复
如果数据库出现问题,您可以使用备份来恢复数据,以便重新获得系统的功能和稳定性。
3、数据备份方法
3.1 通过 hdfs 外部表备份
假设有一张表需要导出到 hdfs 文件系统上,使用下面的命令创建 writable 外部表并加载数据:
CREATE WRITABLE EXTERNAL TABLE table_out (LIKE table)
LOCATION (‘hdfs://host:port/file’)
FORMAT ‘CSV’ (DELIMITER ‘|’ NULL ’ ');
INSERT INTO table_out SELECT * FROM table;
在 HDFS 服务器上便可查看到相应目录下已经产生导出的文件了。
示例:
1、创建外部表:
CREATE WRITABLE EXTERNAL TABLE table1 (LIKE table2)
LOCATION (‘hdfs://path/filename.txt’)
FORMAT ‘TEXT’ (DELIMITER ‘|’);

2、数据插入外部表 :
INSERT INTO table1 SELECT * FROM table2;

3、查询备份文件:
hadoop fs -cat /path/filename.txt

3.2 使用 COPY 命令备份
copy to 命令用于拷贝表内容或 select 查询语句的结果到文件。
如果 select 后面列出部分字段,则仅拷贝指定字段的查询结果到文件中。使用 copy to 命令的表必须授予 select 权限。
该命令只能在表上使用,不能用于视图。
COPY (SELECT…) TO ‘filename’;
示例:
1、copy备份:
COPY (select * from table2) TO ‘hdfs://path/fifilename.txtle’ DELIMITER ‘|’;


4、数据恢复方法
4.1 通过 hdfs 外部表恢复
1、创建外部表,其中 host 和 port 分别表示 HDFS 的 namenode 主机地址和端口号
CREATE EXTERNAL TABLE ext_table(……)
LOCATION (‘hdfs://host:port/filepath’)
FORMAT ‘CSV’ (DELIMITER ‘|’);
2、加载数据到 table 表中:
CREATE TABLE table AS SELECT * FROM ext_table;
或者把建表语句和加载数据分开:
CREATE TABLE table(……);
INSERT INTO table SELECT * FROM ext_table;
根据读取数据文件本身的规模,WuTongDB 会根据用户配置自动调整数据读取的并行度,实现动态并行的数据加载。
示例:
1、创建外部表:
CREATE EXTERNAL TABLE table1
(
area_code bigint,
area_code_name char(6)
)
LOCATION (‘hdfs://path/filename.txt’)
FORMAT ‘TEXT’ (DELIMITER ‘|’);

2、恢复数据到正式表:
CREATE TABLE public.ext_table AS SELECT * FROM public.hdfs_ext_table;

4.2 使用 COPY 命令恢复
copy 命令在 master 节点上可以通过 串行操作 来完成少量的数据导入和导出。 在 copy 命令运行时可以让服务器直接读写文件,因此当前用户必须拥有文件的访问权限。
copy from 命令用于拷贝文件到数据表。如果该命令中的表的列参数未指定,则获取它的缺省值。使用 copy from 命令的表必须授予 insert 权限。
COPY customers FROM ‘filename’ (DELIMITER ‘|’);
示例:
1、创建表:
CREATE TABLE public.copy_table
(
area_code bigint,
area_code_name char(6)
);
2、数据入库:
copy public.copy_table FROM ‘hdfs://path/filename.txt’ DELIMITER ‘|’;
3、查询入库数据:
select * from public.copy_table;






