FLUSH TABLE rt_table
FLUSH TABLE 强制将实时表的RAM块内容刷新到磁盘。
实时表的RAM块会在正常关闭时自动刷新到磁盘,或者每隔rt_flush_period秒周期性刷新。
执行 FLUSH TABLE 命令不仅会强制将RAM块内容写入磁盘,还会触发二进制日志文件的清理。
- SQL
FLUSH TABLE rt;Query OK, 0 rows affected (0.05 sec)随着时间的推移,RT表可能会变得碎片化,分散在多个磁盘块中,并且可能被删除但未清除的数据污染,从而影响搜索性能。在这种情况下,需要进行优化。本质上,优化过程会合并磁盘块对,移除使用DELETE语句之前已删除的文档。
从Manticore 4开始,默认情况下,此过程会自动发生参见服务器设置中的Searchd.md。但是,您也可以使用以下命令手动启动表压缩。
OPTIMIZE TABLE table_name [OPTION opt_name = opt_value [,...]]
OPTIMIZE语句将RT表添加到优化队列中,该队列将在后台线程中处理。
- SQL
OPTIMIZE TABLE rt;默认情况下,OPTIMIZE会将RT表的磁盘块合并到逻辑CPU核心数乘以2的数量以下。
然而,如果表具有KNN索引的属性,这个阈值不同。在这种情况下,它设置为物理CPU核心数除以2,以提高KNN搜索性能。
您还可以通过cutoff选项手动控制被优化的磁盘块数量。
其他选项包括:
- 服务器设置optimize_cutoff以覆盖默认阈值
- 表设置optimize_cutoff
- SQL
OPTIMIZE TABLE rt OPTION cutoff=4;当使用OPTION sync=1(默认为0)时,该命令会在优化过程完成后再返回。如果连接中断,优化将继续在服务器上运行。
- SQL
OPTIMIZE TABLE rt OPTION sync=1;优化可能是一个耗时且I/O密集型的过程。为了最小化其影响,实际合并工作是在一个特殊的后台线程中串行执行的,而OPTIMIZE语句只是将其添加到队列中。优化线程可以进行I/O限制,并可以通过rt_merge_iops和rt_merge_maxiosize指令分别控制每秒的最大I/O次数和最大I/O大小。
在优化过程中,正在优化的RT表几乎一直在线并可供搜索和更新使用。当成功合并一对磁盘块时,表会被锁定一个非常短暂的时间,以便重命名旧文件和新文件,并更新表头。
只要auto_optimize没有禁用,表就会自动优化。
如果您遇到意外的SST或希望集群中所有节点上的表二进制相同,则需要:
- 禁用auto_optimize。
- 手动优化表:
在一个节点上从集群中删除表:
‹›- SQL
SQL📋⚙ALTER CLUSTER mycluster DROP myindex;优化表:
‹›- SQL
SQL📋⚙OPTIMIZE TABLE myindex;将表重新添加回集群:
‹›- SQL
SQL📋⚙ALTER CLUSTER mycluster ADD myindex;当表重新添加回集群时,优化过程中创建的新文件将被复制到集群中的其他节点。 其他节点上对该表所做的任何本地更改都将丢失。
对表数据的修改(插入、替换、删除、更新)应选择以下之一:
- 推迟这些操作,
- 将它们定向到正在运行优化过程的节点。
请注意,在表退出集群期间,插入/替换/删除/更新命令应不带集群名称前缀(对于SQL语句或HTTP JSON请求中的集群属性),否则将失败。 一旦表重新添加到集群,您必须恢复对该表的写入操作,并再次包含集群名称前缀,否则这些操作将失败。
在优化过程中,可以在任何节点上正常使用搜索操作。
Manticore 在实时表的刷新和合并过程中提供隔离,防止任何更改影响正在运行的查询。
例如,在表压缩期间,一对磁盘块会被合并并产生一个新的块。在某个时刻,会创建表的新版本,新块替换了原始的这一对块。这一过程是无缝进行的,因此使用原始块的长时间运行的查询将继续看到旧版本的表,而新的查询将看到包含合并后块的新版本。
同样适用于刷新 RAM 块的情况,此时合适的 RAM 段会被合并成新的磁盘块,而参与的 RAM 块段则被放弃。在此操作期间,Manticore 对操作开始前启动的查询提供隔离。
此外,这些操作对替换和更新是透明的。如果您更新属于正在与另一个块合并的磁盘块中的文档的属性,更新将应用于该块和合并后生成的新块。如果在合并期间删除文档,该文档将同时在原始块和合并后生成的新块中被删除,新块要么将该文档标记为已删除,要么如果删除发生在合并过程的早期,则根本不会包含该文档。
“冻结”表在您想要创建物理副本或备份时很有用。它将表的文件标记为冻结,并显示它们的存储位置。冻结后,您可以安全地将这些文件复制到其他位置。您仍然可以向冻结的表中添加新文档,直到达到 rt_mem_limit,但新数据会保留在内存中,直到表被解冻才会写入磁盘。如果表超过 rt_mem_limit,所有更改将暂停,直到表被解冻。如果守护进程意外停止,任何未保存的数据将从二进制日志中恢复。
“锁定”表对于逻辑备份很有用。它不会阻止内部维护任务,例如磁盘块合并操作或将 RAM 块写入磁盘。它仅阻止写操作。这意味着您无法在锁定的表中插入、替换或更新数据。这对于像 mysqldump 这样的工具很有帮助,因为锁定可以确保数据保持逻辑一致性。例如,如果没有锁定,在转储期间如果替换了一个文档,旧版本可能已经存在于转储中,而新版本可能稍后也会出现,两者具有相同的文档 ID。锁定表可以防止这种情况。
FREEZE tbl1[, tbl2, ...]
FREEZE 为实时/普通表准备安全的 备份。具体来说,它:
- 禁用表压缩。如果表当前正在压缩,
FREEZE将优雅地中断它。 - 将当前 RAM 块转移到磁盘块。
- 刷新属性。
- 禁用可能修改磁盘文件的隐式操作。
- 增加表的锁定计数器。
- 显示与表关联的实际文件列表。
如果表已经冻结(锁定),FREEZE 将:
- 增加表的锁定计数器。
- 显示与表关联的实际文件列表。
内置工具 manticore-backup 使用 FREEZE 来确保数据一致性。如果您想创建自己的备份解决方案或出于其他原因需要冻结表,也可以这样做。只需按照以下步骤操作:
FREEZE一个表(或几个)。- 捕获
FREEZE命令的输出并备份指定的文件。 - 完成后
UNFREEZE表。
- Example
FREEZE t;+-------------------+---------------------------------+
| file | normalized |
+-------------------+---------------------------------+
| data/t/t.0.spa | /work/anytest/data/t/t.0.spa |
| data/t/t.0.spd | /work/anytest/data/t/t.0.spd |
| data/t/t.0.spds | /work/anytest/data/t/t.0.spds |
| data/t/t.0.spe | /work/anytest/data/t/t.0.spe |
| data/t/t.0.sph | /work/anytest/data/t/t.0.sph |
| data/t/t.0.sphi | /work/anytest/data/t/t.0.sphi |
| data/t/t.0.spi | /work/anytest/data/t/t.0.spi |
| data/t/t.0.spm | /work/anytest/data/t/t.0.spm |
| data/t/t.0.spp | /work/anytest/data/t/t.0.spp |
| data/t/t.0.spt | /work/anytest/data/t/t.0.spt |
| data/t/t.meta | /work/anytest/data/t/t.meta |
| data/t/t.ram | /work/anytest/data/t/t.ram |
| data/t/t.settings | /work/anytest/data/t/t.settings |
+-------------------+---------------------------------+
13 rows in set (0.01 sec)file 列表示运行实例的 data_dir 中的表文件路径。normalized 列显示相同文件的绝对路径。要备份表,只需复制提供的文件,无需额外准备。
当表被冻结时,您无法执行 UPDATE 查询;它们将等待表被解冻。
此外,DELETE 和 REPLACE 查询在表被冻结时有一些限制:
- 如果
DELETE影响当前 RAM 块中的文档 - 允许。 - 如果
DELETE影响磁盘块中的文档但之前已被删除 - 允许。 - 如果
DELETE会修改实际磁盘块 - 将等待直到表被解冻。
手动 FLUSH 冻结表的 RAM 块将报告“成功”,但不会发生实际保存。
DROP/TRUNCATE 冻结表 是 允许的,因为这些操作不是隐式的。我们假设如果您截断或删除表,您不需要备份;因此,它最初不应被冻结。
INSERT 到冻结表中是支持的,但有限制:新数据将存储在 RAM 中(如常)直到达到 rt_mem_limit;然后,新插入将等待直到表被解冻。
如果您关闭带有冻结表的守护进程,它将表现为经历了脏关闭(例如,kill -9):新插入的数据将 不会 保存在磁盘上的 RAM 块中,并且在重启后,它将从二进制日志(如果有的话)中恢复或丢失(如果禁用了二进制日志)。
UNFREEZE tbl1[, tbl2, ...]
UNFREEZE 命令减少表的锁定计数器,如果计数器达到零,将重新激活之前被阻止的操作并恢复内部压缩服务。任何等待表解冻的操作也将恢复并正常完成。
- Example
UNFREEZE tbl;您可以使用 SHOW table_name STATUS 来检查表是否被冻结。
锁定计数器显示在表状态的 locked 列下。值为零表示表未被冻结,而非零值表示活动锁定的数量。每个显式的 FREEZE 命令和隐式锁定(例如,当表属于集群且复制例程将其选为副本的供体时)都会增加计数器。每个 UNFREEZE 命令都会减少计数器,最终降至零。
- Example
SHOW TABLE `foo` STATUS LIKE 'locked';+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| locked | 2 |
+---------------+-------+
1 row in set (0,00 sec)lock tables tbl1 read[, tbl2 read, ...]
您可以在 SQL 客户端会话中显式锁定表,以与其他会话协调访问,或在需要独占访问时阻止其他会话更改数据。一个会话只能为自己锁定或解锁表。它不能代表其他会话锁定或解锁表。锁只能在通过 MySQL 协议连接的 SQL 会话中使用。当表被锁定时,不允许任何协议更改其数据(SQL / HTTP / 二进制)。锁对于属于复制集群的表也不起作用。
Manticore 仅支持 读取(共享) 锁。写入(独占) 锁不被支持。
当会话请求读锁时,Manticore:
- 检查连接是否使用MySQL协议。
- 检查表是否可以被锁定。它必须是本地实时表或percolate表,并且不能是复制集群的一部分。
- 自动释放会话当前持有的所有锁。
- 等待表上所有正在进行的插入、替换、更新或删除操作完成。
- 增加表的读锁计数器(参见SHOW LOCKS)。
任何修改语句(DML)如 INSERT、REPLACE、UPDATE、DELETE 和 TRUNCATE 会首先检查表是否被读锁锁定。如果被锁定,语句将失败并返回错误 table is locked。DDL 语句(如 CREATE、ALTER、DROP)不会被读锁阻塞。
- Example
--------------
LOCK TABLES tbl READ
--------------
Query OK, 0 rows affected (0.000 sec)
--------------
LOCK TABLES tbl READ, tbl2 WRITE
--------------
Query OK, 0 rows affected, 1 warning (0.000 sec)
--------------
SHOW WARNINGS
--------------
+---------+------+--------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------+
| warning | 1000 | Write lock is not implemented. |
+---------+------+--------------------------------+
1 row in set (0.000 sec)UNLOCK TABLES 命令显式释放当前SQL会话持有的所有表锁。
如果客户端会话的连接正常或异常终止,守护进程会隐式释放会话持有的所有表锁。如果客户端重新连接,这些锁将不再生效。 UNLOCK TABLES;
- Example
## SHOW LOCKSSHOW LOCKS 命令列出当前被锁定或冻结的所有表。
每一行显示表类型、名称、锁的类型以及一个计数器,该计数器指示该锁被应用的次数。 锁类型可以是:
read — 表被读锁保护。在锁释放之前,修改语句将失败。
freeze— 表被冻结。这会阻止任何将数据写入磁盘的操作,直到表被解冻。- CODE_BLOCK_10
- Example
SHOW LOCKS;+-----------+------+-----------+-----------------+
| Type | Name | Lock Type | Additional Info |
+-----------+------+-----------+-----------------+
| rt | a | read | Count: 1 |
| percolate | bar | freeze | Count: 3 |
| rt | foo | freeze | Count: 2 |
+-----------+------+-----------+-----------------+
3 rows in set (0,01 sec)