本主题阐述如何启动和停止 Vertica 数据库以及如何使用数据库索引工具。
1 - 启动数据库
可通过以下方式之一启动数据库:
管理工具
可使用 Vertica 管理工具 (Administration Tools) 启动数据库:
-
打开管理工具 (Administration Tools) 并选择查看数据库群集状态 (View Database Cluster State),以确保所有节点都处于关闭状态且没有其他数据库正在运行。
-
打开管理工具。有关访问管理工具的信息,请参阅使用管理工具。
-
在主菜单 (Main Menu) 上,选择启动数据库 (Start Database),再选择确定 (OK)。
-
选择要启动的数据库,再单击确定 (OK)。
当心
一次只启动一个数据库。如果在给定时间启动多个数据库,结果可能无法预测:用户可能会遇到资源冲突,或者对错误的数据库执行操作。 -
输入数据库密码,再单击确定 (OK)。
-
当提示数据库已成功启动时,单击确定 (OK)。
-
检查日志文件,以确保未发生启动问题。
命令行
可使用命令行工具start_db
启动数据库:
$ /opt/vertica/bin/admintools ‑t start_db ‑d db‑name
[‑p password]
[‑s host1[,...] | ‑‑hosts=host1[,...]]
[‑‑timeout seconds]
[‑i | ‑‑noprompts]
[‑‑fast]
[‑F | ‑‑force]
以下示例使用 start_db
启动单节点数据库:
$ /opt/vertica/bin/admintools -t start_db -d VMart
Info:
no password specified, using none
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (DOWN)
Node Status: v_vmart_node0001: (UP)
Database VMart started successfully
Eon 模式数据库节点启动
在启动 Eon 模式数据库时,您可以启动所有主节点或一部分主节点。在这两种情况下,将主节点列表传递给 start_db
以从 ‑s
选项开始。
需要满足以下要求:
- 主节点主机必须已启动才能启动数据库。
start_db
工具无法启动已停止的主机,例如基于云的虚拟机。您必须手动启动主机或使用 MC 启动群集。
以下示例启动六节点 Eon 模式数据库中的三个主节点:
$ admintools -t start_db -d verticadb -p 'password' \
-s 10.11.12.10,10.11.12.20,10.11.12.30
Starting nodes:
v_verticadb_node0001 (10.11.12.10)
v_verticadb_node0002 (10.11.12.20)
v_verticadb_node0003 (10.11.12.30)
Starting Vertica on all nodes. Please wait, databases with a large catalog may take a while to initialize.
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (DOWN) v_verticadb_node0002: (DOWN) v_verticadb_node0003: (DOWN)
Node Status: v_verticadb_node0001: (UP) v_verticadb_node0002: (UP) v_verticadb_node0003: (UP)
Syncing catalog on verticadb with 2000 attempts.
Database verticadb: Startup Succeeded. All Nodes are UP
数据库启动后, 辅助子群集将关闭。您可以根据需要选择启动它们。请参阅启动子群集。
启动包含部分主节点的数据库
作为最佳实践,Vertica 建议您始终启动包含所有主节点的 Eon 模式数据库。有时,并非针对每个主节点都能启动主机。在这种情况下,您可能需要启动包含部分数据库主节点的数据库。
如果 start_db
指定数据库主节点的子集,则适用以下要求:
- 节点必须包含一个仲裁:群集中所有主节点的至少 50% + 1。
- 总的来说,节点必须为公共存储中的所有分片提供覆盖率。用于启动数据库的主节点在启动时不会尝试重新平衡分片订阅。
如果无法满足其中一个或两个条件,则 start_db
返回错误。在下面的示例中,start_db
指定了包含九个主节点的数据库中的三个主节点。该命令返回一个错误,它无法启动少于五个主节点的数据库:
$ admintools -t start_db -d verticadb -p 'password' \
-s 10.11.12.10,10.11.12.20,10.11.12.30
Starting nodes:
v_verticadb_node0001 (10.11.12.10)
v_verticadb_node0002 (10.11.12.20)
v_verticadb_node0003 (10.11.12.30)
Error: Quorum not satisfied for verticadb.
3 < minimum 5 of 9 primary nodes.
Attempted to start the following nodes:
Primary
v_verticadb_node0001 (10.11.12.10)
v_verticadb_node0003 (10.11.12.30)
v_verticadb_node0002 (10.11.12.20)
Secondary
hint: you may want to start all primary nodes in the database
Database start up failed. Cluster partitioned.
如果您尝试启动包含部分主节点的数据库并且群集无法启动,Vertica 进程可能会继续在某些主机上运行。如果是这样,后续尝试启动数据库时将返回如下错误:
Error: the vertica process for the database is running on the following hosts:
10.11.12.10
10.11.12.20
10.11.12.30
This may be because the process has not completed previous shutdown activities. Please wait and retry again.
Database start up failed. Processes still running.
Database verticadb did not start successfully: Processes still running.. Hint: you may need to start all primary nodes.
在启动数据库之前,必须在错误消息中列出的主机上,使用 admintools 菜单或 admintools 命令行的 stop_host
工具停止 Vertica 服务器进程:
$ admintools -t stop_host -s 10.11.12.10,10.11.12.20,10.11.12.30
2 - 停止数据库
在很多情况下,必须停止数据库,例如,在升级或执行各种维护任务之前。可以通过以下方法之一停止正在运行的数据库:
如果已连接任何用户或者 Database Designer 正在构建或部署数据库设计,则无法停止正在运行的数据库。
提示
管理工具
要使用 admintools 停止正在运行的数据库:
-
验证是否所有群集节点都已启动。如果任何节点已关闭,请确定并重新启动它们。
-
关闭所有用户会话:
-
通过查询
SESSIONS
系统表确定所有具有活动会话的用户。通知用户即将关闭,并请求他们关闭其会话。 -
通过将配置参数 MaxClientSessions 暂时重置为 0 来阻止用户启动新会话:
=> ALTER DATABASE DEFAULT SET MaxClientSessions = 0;
-
使用 Vertica 函数
CLOSE_SESSION
和CLOSE_ALL_SESSIONS
关闭所有剩余用户会话。
注意
还可以使用函数SHUTDOWN
强制关闭数据库并阻止新会话。 -
-
打开 Vertica 管理工具。
-
从主菜单中:
-
选择“停止数据库 (Stop Database)”
-
单击确定 (OK)
-
-
选择要停止的数据库,然后单击确定 (OK)。
-
输入密码(如果系统询问),然后单击确定 (OK)。
-
当系统提示数据库关闭完成时,单击确定 (OK)。
命令行
可以使用命令行工具 stop_db
停止数据库:
$ /opt/vertica/bin/admintools -t stop_db -d db-name [-p password] [-F | --force]
如果省略 -F
(或 --force
)选项,则该命令将检查有无活动会话。如果用户已连接到数据库,则该命令将中止并显示一条错误消息,还将列出所有活动会话。例如:
$ /opt/vertica/bin/admintools -t stop_db -d VMart
Info: no password specified, using none
Active session details
| Session id | Host Ip | Connected User |
| ------- -- | ---- -- | --------- ---- |
| v_vmart_node0001-91901:0x162 | 10.20.100.247 | ryan |
Database VMart not stopped successfully for the following reason:
Unexpected output from shutdown: Shutdown: aborting shutdown
NOTICE: Cannot shut down while users are connected
使用选项 -F
(或 --force
)将覆盖用户连接并强制关闭。
Vertica 函数
可以使用 SHUTDOWN 函数停止数据库。默认情况下,如果连接了任何用户,则关闭将失败。如果要强制关闭而不考虑任何活动用户连接,则可以运行以下命令:
=> SELECT SHUTDOWN('true');
SHUTDOWN
-------------------------
Shutdown: sync complete
(1 row)
在 Eon 模式数据库中,可以使用 SHUTDOWN_SUBCLUSTER 和 SHUTDOWN_WITH_DRAIN 函数停止子群集。SHUTDOWN_SUBCLUSTER 会立即关闭子群集,而 SHUTDOWN_WITH_DRAIN 会执行正常关闭,在关闭子群集之前从子群集中排空客户端连接。有关详细信息,请参阅启动和停止子群集。
以下示例演示了如何使用 SHUTDOWN_WITH_DRAIN 关闭 Eon 模式数据库中的所有子群集:
=> SELECT SHUTDOWN_WITH_DRAIN('', 0);
NOTICE 0: Begin shutdown of subcluster (default_subcluster, analytics)
SHUTDOWN_WITH_DRAIN
-----------------------------------------------------------------------
Shutdown message sent to subcluster (default_subcluster, analytics)
(1 row)
3 - CRC 和排序顺序检查
作为超级用户,您可以对 Vertica 数据库运行索引工具以执行两个任务:
-
对现有数据存储上的每个块运行循环冗余检查 (CRC),以检查 ROS 数据块的数据完整性。
-
检查 ROS 容器中的排序顺序是否正确。
如果数据库出现故障,请从 Linux 命令行调用索引工具。如果数据库已启动,请使用 Vertica 元函数
RUN_INDEX_TOOL
从 VSQL 调用:
如果从命令行调用,索引工具仅在当前节点上运行。但是,您可以同时对多个节点运行索引工具。
结果输出
索引工具将操作相关的摘要信息写入至标准输出;结果的详细信息记录在两个位置之一,具体取决于调用该工具的环境:
有关评估输出中是否可能有错误的信息,请参阅:
优化性能
可以通过将操作范围缩小到一个或多个投影并指定用于执行函数的线程数来优化元函数性能。有关详细信息,请参阅
RUN_INDEX_TOOL
。
3.1 - 评估 CRC 错误
在每次提取数据磁盘以进行查询处理时,Vertica 都会评估每个 ROS 数据块中的 CRC 值。如果在提取数据时出现 CRC 错误,则会将以下信息写入 vertica.log
文件:
CRC Check Failure Details:File Name:
File Offset:
Compressed size in file:
Memory Address of Read Buffer:
Pointer to Compressed Data:
Memory Contents:
事件管理器也会收到关于 CRC 错误的通知,因此您可以使用 SNMP 陷阱来捕获 CRC 错误:
"CRC mismatch detected on file <file_path>. File may be corrupted. Please check hardware and drivers."
如果您从 vsql、ODBC 或 JDBC 运行查询,则查询会返回 FileColumnReader ERROR
。此消息指出特定块的 CRC 与给定记录不匹配,如下所示:
hint: Data file may be corrupt. Ensure that all hardware (disk and memory) is working properly.
Possible solutions are to delete the file <pathname> while the node is down, and then allow the node
to recover, or truncate the table data.code: ERRCODE_DATA_CORRUPTED
3.2 - 评估排序顺序错误
如果 ROS 数据未按投影的顺序正确排序,则依赖于已排序数据的查询结果就会不正确。如果您怀疑有或已经发现不正确的查询结果,则可以使用索引工具来检查 ROS 排序顺序。索引工具会对每个 ROS 行进行评估,以确定其排序是否正确。如果检查发现某行的顺序不正确,则它会向日志文件中写入一条错误消息以及未排序行的行号和内容。
查看错误
-
打开
indextool.log
文件。例如:$ cd VMart/v_check_node0001_catalog
-
查看包含 OID 编号和字符串
Sort Order Violation
的错误消息。例如:<INFO> ...on oid 45035996273723545: Sort Order Violation:
-
通过对
indextool.log
运行grep
,查找有关排序顺序违规字符串的详细信息。例如,以下命令将返回每个字符串前面的行 (-B1
) 以及后面的四行 (-A4
) :[15:07:55][vertica-s1]: grep -B1 -A4 'Sort Order Violation:' /my_host/databases/check/v_check_node0001_catalog/indextool.log
2012-06-14 14:07:13.686 unknown:0x7fe1da7a1950 [EE] <INFO> An error occurred when running index tool thread on oid 45035996273723537: Sort Order Violation: Row Position: 624 Column Index: 0 Last Row: 2576000 This Row: 2575000 -- 2012-06-14 14:07:13.687 unknown:0x7fe1dafa2950 [EE] <INFO> An error occurred when running index tool thread on oid 45035996273723545: Sort Order Violation: Row Position: 3 Column Index: 0 Last Row: 4 This Row: 2 --
-
通过查询
STORAGE_CONTAINERS
系统表,查找发生排序顺序违规的投影。使用等于indextool.log
中所列 OID 值的storage_oid
。例如:=> SELECT * FROM storage_containers WHERE storage_oid = 45035996273723545;