6. 导出和导入数据
在使用内存数据库时,将数据保存到持久存储(即基于磁盘的文件)或从持久存储加载数据可能非常重要。有许多命令可用于此操作。另外,在使用持久数据库时,可能需要使用备份命令来保存其当前状态的快照。
保存和加载类数据
要将整个类(表)的数据保存到外部文件或从外部文件加载,使用 saveclass 和 loadclass 命令,它们具有以下语法:
XSQL>saveclass <file-path> <table-name>
XSQL>loadclass <file-path> <table-name>
为了对此进行演示,从 samples/xsql/scripts/financial 目录中,使用以下命令启动 xSQL 来创建并显示“账户”表:
xsql -size 100m -i -f account.sql
select * from Account;
userid name lastlog
------------------------------------------------------------------------------
101 Dennis Hamer 01/23/2015 14:15:03
102 Edith Jackson 02/12/2015 19:30:16
103 Eric Harmon 02/14/2015 09:34:47
Selected records: 3
现在执行以下命令来保存和加载“账户”表的数据:
XSQL>saveclass account.txt Account
XSQL>delete from Account;
XSQL>select * from Account;
userid name lastlog
------------------------------------------------------------------------------
Selected records: 0
XSQL>loadclass account.txt Account
XSQL>select * from Account;
userid name lastlog
------------------------------------------------------------------------------
101 Dennis Hamer 01/23/2015 14:15:03
102 Edith Jackson 02/12/2015 19:30:16
103 Eric Harmon 02/14/2015 09:34:47
Selected records: 3
请注意,在删除数据后,我们确认了该表为空;然后从 account.txt 加载后,数据得以恢复。
保存和加载数据库映像
要将内存中数据库(瞬态对象)的映像保存到指定文件,请使用“保存”命令,其语法如下:
XSQL>save <file-path>
例如:
XSQL>save account_db.img
若要打开(加载)已保存为图像文件的数据库,还必须保存准确描述该数据库的元数据:
XSQL>savemeta account_db.cfg
现在,我们可以使用 xSQL 选项 -image <文件名> 从指定文件加载数据库。例如:
xsql -size 100m -i -c account_db.cfg -image account_db.img
(请注意,无论图像文件是由 xSQL 还是任何 SmartEDB SQL API 创建的,xSQL 的元数据规范必须与用于保存图像的元数据规范完全相同)。
保存元数据和字典信息
可能有必要使用 xSQL 或其他 SmartEDB SQL 应用程序打开通过某个应用程序创建的持久数据库。为了能够做到这一点,xSQL 必须使用与原始数据库完全相同的元数据(运行时选项、页面大小、设备、数据库参数和字典)。(请注意,应用程序可以在 C API 中使用 mco_db_save_metadata()函数,或者在 C++、Java、C# 或 Python API 中使用等效方法来保存数据库元数据。)元数据以 JSON 格式保存在 xSQL 配置文件中。因此,随后可以在启动时通过配置文件加载元数据,如上所示。
要将 xSQL 中的数据库模式保存到指定文件中:
XSQL>savedict <file-path>
整个数据库的备份
以下命令用于备份和恢复内存中或持久性的数据库:
XSQL>backup [TO] file_name [FULL|INCREMENTAL|AUTO] [[AS] label] [WITH CIPHER=key [',' COMPRESSION=level ]];
请注意,“file_name”参数是必需的;其他参数是可选的。“restore”命令用于从给定的备份文件将备份应用到当前数据库。
XSQL>restore [FROM] file_name [[TO] label] [WITH CIPHER=key];
如果需要从几个连续的备份中恢复数据库,则必须按时间顺序多次调用“restore”来完成。要列出备份文件的内容,请使用 SQL 函数“backup <backup-file>
”将备份标签和一些通用备份信息打印到控制台:
XSQL>select * from backup <backup-file>;
关于数据库备份的说明
备份文件的大小可能等于或超过数据库的实际大小。这是因为备份帧包含开销——增量可能大于修改数据的实际大小。
在备份数据库时,除了备份过程结束时的短时间外,它可同时用于读和写操作。在每次备份结束时,数据库会被锁定并无法进行更新。这对应用程序是透明的;写事务将等待数据库可用。请注意,很有可能在循环中执行连续备份。例如,使用 bash:
!/bin/bash
While true; do
xsql ... "BACKUP ..."
done
- 从备份文件进行恢复需要对数据库的独占访问。
- 备份协议保持数据库的完整性,并且不允许从无序的备份中恢复数据库。
从 CSV 文件导入
通常,从外部 CSV 文件导入数据是很有用的。这可以通过 import 命令来完成,其语法为:
XSQL>import TABLE CSV-FILE [(use|skip) header] [commit N]
请注意,如果指定了 use,标题行将指示要导入的列名;否则,如果指定了 skip,则在导入数据的每一行中都期望包含所有表列;如果存在 commit N,则指定事务阻塞因子,即每次数据库提交的输入行数。
可能的分隔符字符由字符串“;, | \t ”定义。在输入流中遇到的这些字符中的第一个将用作后续数据的分隔符。以下是一些示例输入字符串,解释它们将如何被解释:
A;B,C;D|E - the ';' will be used as delimiter, there are three fields: 'A', 'B,C' and 'D|E'
A,B,C;D|E - the ';' will be used as delimiter, there are three fields: 'A', 'B' and 'C;D|E'
A|B,C;D|E - the '|' will be used as delimiter, there are three fields: 'A', 'B,C;D' and 'E'
例如,示例文件 account.csv 可以如下导入:
XSQL>import Account account.csv skip header
Import of 4 records completed in 0 milliseconds
XSQL>select * from Account;
userid name lastlog
-----------------------------------------------
101 Dennis Hamer 01/23/15 14:15:03
102 Edith Jackson 02/12/15 19:30:16
103 Eric Harmon 02/14/15 09:34:47
104 James Taylor 03/30/15 19:24:27
105 Jackson Brown 04/02/15 09:17:11
106 Eric Clapton 04/14/15 23:59:07
107 Van Morrison 04/20/15 20:22:18
Selected records: 7
在 xSQL 用户指南的章节中,展示了一些从具有各种格式(包括纽约证券交易所报价和芝加哥商品交易所交易)的 CSV 文件导入数据的更详细示例。(另外,请参考此用户指南以了解 xSQL 的更多高级功能。)并且请注意,还有 SQL 函数可执行上述描述的数据导入和备份功能。例如,要备份一个持久数据库:
select backup('copy.dbs', 'copy.log', 1);
或者为内存数据库保存一个快照:
select save_snapshot('saved.img');
请参考 xSQL 用户指南的章节,以获取关于 xSQL 函数的进一步解释和示例。本教程的下一步将演示如何在 xSQL 中使用一些强大的 SmartEDB SQL 分析函数。