Move the docs folder

This commit is contained in:
LINxiansheng
2022-02-10 14:51:49 +08:00
committed by LINxiansheng
parent 7c6dcc6712
commit d42f317422
1160 changed files with 0 additions and 3 deletions

View File

@ -0,0 +1,21 @@
快速入门指南
===========================
快速入门指南介绍如何快速试用 OceanBase 数据库,包括安装 OceanBase 数据库、连接 OceanBase 数据库,以及基本操作。
快速入门指南包含以下内容:
1. [安装 OBD](../2.quickstart/3.use-obd-to-obtain-the-oceanbase-database.md)
2. [使用 OBD 部署 OceanBase 数据库](../2.quickstart/4.deploy-the-oceanbase-database-by-using-obd.md)
3. [基本操作](../2.quickstart/6.basic-operations/1.database-operations.md)

View File

@ -0,0 +1,82 @@
在 CentOS7 镜像上部署 OceanBase 数据库
==================================================
OceanBase 数据库支持在 CentOS7 上运行。本文介绍如何在 CentOS7 的 Docker 镜像上部署 OceanBase 数据库。
前提条件
-------------------------
在 CentOS7 的 Docker 镜像上部署 OceanBase 数据库之前,您需要确认以下信息:
* 您已经安装了 Docker 和 Git。
Docker 安装详情,参考 [Docker 文档](https://www.docker.com/get-started)。
Git 安装详情,参考 [Git 文档](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)。
* 您已经启动了 Docker。
操作步骤
-------------------------
按照以下步骤下载 CentOS7 镜像并部署 OceanBase 数据库。
1. 拉取 CentOS7 镜像。
```bash
docker pull centos:7
docker run -d -i -t centos:7 /bin/bash
docker exec -it <CONTAINER ID> /bin/bash
```
**注意**
您必须将 `CONTAINER ID` 替换为您的 centos:7 容器 ID。
2. 使用 OBD 部署 OceanBase 数据库。
```unknow
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y ob-deploy
source /etc/profile.d/obd.sh
git clone https://github.com/oceanbase/obdeploy.git
cd obdeploy
obd cluster deploy c1 -c ./example/mini-local-example.yaml
```
详细信息,参考 [快速上手](https://open.oceanbase.com/quickStart)。
3. 增加 Docker 内存至 8G。
详细信息,Mac 用户参考 [Docker 桌面版 Mac 用户手册](https://docs.docker.com/docker-for-mac/#memory),Window 用户参考 [Docker 桌面版 Windows 用户手册](https://docs.docker.com/docker-for-windows/#advanced)。
4. 连接 OceanBase 数据库。
```unknow
yum install -y obclient
obd cluster start c1
obclient -h127.0.0.1 -P2881 -uroot
```
详细信息,参考 [快速上手](https://open.oceanbase.com/quickStart)。

View File

@ -0,0 +1,68 @@
安装 OBD
===========================
本文介绍如何安装 OceanBase 部署工具 OBD。
获取 OceanBase 数据库最快的方式是使用 OBD 获取,因此推荐您使用此方式体验 OceanBase 数据库。您还可以通过以下方式获取 OceanBase 数据库:
* [使用源码构建 OceanBase 数据库](../4.installation-and-deployment/13.get-the-oceanbase-database-by-using-source-code.md)。
* [使用 RPM 包安装 OceanBase 数据库](../4.installation-and-deployment/12.install-the-oceanbase-database-by-using-the-rpm-package.md)。
前提条件
-------------------------
在安装 OceanBase 数据库之前,您需要确认已下信息:
* 您的机器满足软硬件要求。详情参考 [资源准备](../4.installation-and-deployment/3.resource-preparation.md)。
* 您的机器可以连接公网。
如果您的机器不能连接公网,您需要 [使用 RPM 包安装 OceanBase 数据库](../4.installation-and-deployment/12.install-the-oceanbase-database-by-using-the-rpm-package.md)。
获取 OBD
---------------------------
您可以通过以下方式获取 OBD:
* 通过编译源码获取。详情参考 [OBD 文档](https://github.com/oceanbase/obdeploy/blob/master/README-CN.md)。
* 通过 RPM 安装包获取。详情参考 [OBD 文档](https://github.com/oceanbase/obdeploy/blob/master/README-CN.md)。
安装 OBD
---------------------------
运行以下命令,安装 OBD:
```bash
yum install -y ob-deploy-1.0.0-1.el7.x86_64.rpm
source /etc/profile.d/obd.sh
```
后续操作
-------------------------
如果您的机器可以连接公网,在您执行了 `obd cluster deploy` 命令之后,OBD 将检查您的目标机器是否有 OceanBase 数据库安装包。如果没有安装包,OBD 将自动从 yum 源获取。详情参考 [使用 OBD 部署 OceanBase 数据库](../2.quickstart/4.deploy-the-oceanbase-database-by-using-obd.md)。

View File

@ -0,0 +1,234 @@
使用 OBD 部署 OceanBase 数据库
============================================
本文介绍如何使用 OBD 部署 OceanBase 数据库。
名词解释
-------------------------
* 中控机器
存储 OceanBase 数据库安装包和集群配置信息的机器。
* 目标机器
安装 OceanBase 数据库的机器。
前提条件
-------------------------
在连接 OceanBase 数据库之前,请您确认以下信息:
* 您已经在中控机器安装了 OBD。详细信息,参考 [安装 OBD](../2.quickstart/3.use-obd-to-obtain-the-oceanbase-database.md)。
* 您已经在目标机器安装了 OceanBase 数据库。
* 您已经在中控机器安装了 OceanBase 数据库的客户端 OBClient。详细信息,参考 [OBClient 文档](https://github.com/oceanbase/obclient/blob/master/README.md)。
修改配置文件
---------------------------
1. 从 GitHub 上下载对应的配置文件模板。
如果您采用本地安装,即中控机器和目标机器是同一台机器,请下载 [本地安装配置文件](https://github.com/oceanbase/obdeploy/blob/master/example/mini-single-example.yaml)。
如果您采用单机安装,即中控机器和目标机器不是同一台机器,且目标机器只有一台,请下载 [单机安装配置文件](https://github.com/oceanbase/obdeploy/blob/master/example/mini-local-example.yaml)。
如果您采用分布式安装,即中控机器和目标机器不是同一台机器,且目标机器有多台,请下载 [分布式安装配置文件](https://github.com/oceanbase/obdeploy/blob/master/example/mini-distributed-example.yaml)。
**注意**
此处以本地安装为例,介绍如何修改配置文件。您必须按照您的安装方式选择对应的配置文件模板。
2. 在配置文件顶部添加用户密码信息。
```yaml
user:
username: <您的账号名>
password: <您的登录密码>
key_file: <您的私钥路径>
```
其中,`username` 为登录到目标机器的用户名,确保您的用户名有 observer 进程工作目录 `home_path` 的权限。
**注意**
通常情况下,您只能使用登录密码或者私钥登录中的一种方式目标机器。
3. 修改配置文件中的 IP 地址。
```yaml
oceanbase-ce:
servers:
- name: z1
# Please don't use hostname, only IP can be supported
ip: 11.166.80.01
```
4. 修改配置文件中的 `devname` 变量和 `home_path`。
```yaml
oceanbase-ce:
global:
home_path: <your_observer_work_path>
# Please set devname as the network adaptor's name whose ip is in the setting of severs.
# if set severs as "127.0.0.1", please set devname as "lo"
# if current ip is 192.168.1.10, and the ip's network adaptor's name is "eth0", please use "eth0"
devname: bond0
```
**注意**
您需要拥有 `home_path` 目录的权限。
启动 OceanBase 数据库
-------------------------------------
1. 运行以下命令部署集群:
```bash
obd cluster deploy <deploy_name> -c <deploy_config_path>
```
其中,`deploy_name` 为集群名称。一个集群只能有一个名称,且集群名称不能重复。
2. 运行以下命令启动集群:
```bash
obd cluster start <deploy_name>
```
3. 运行以下命令查看集群状态:
```bash
obd cluster display <deploy_name>
```
连接 OceanBase 数据库
-------------------------------------
按照以下步骤连接 OceanBase 数据库:
1. 安装 OceanBase 数据库客户端 OBClient:
如您的机器已添加 OceanBase 官方 YUM 源作为软件源,使用以下命令直接安装:
```unknow
sudo yum install -y obclient
```
否则您需要在机器上准备好离线安装包,并执行以下命令安装:
```unknow
sudo yum install -y libobclient-2.0.0-2.el7.x86_64.rpm
sudo yum install -y obclient-2.0.0-2.el7.x86_64.rpm
```
**注意**
您必须首先下载 OBClient 的依赖包 LibOBClient。示例中的安装包可能不是最新版本,建议您下载最新的安装包。详细信息,参考 [下载中心](https://open.oceanbase.com/softwareCenter/community)。
2. 运行以下命令,使用 OBClient 客户端连接 OceanBase 数据库:
```unknow
obclient -h<your_ip> -P<observer_mysql_port> -uroot
```
其中,`your_ip` 为您 OceanBase 实例所在的机器 IP 地址。`observer` 默认使用端口 `2881` 连接 OBClient。如果您对端口做了更改,此处使用您实际的端口号。
返回以下信息:
```unknow
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3221546072
Server version: 5.7.25 OceanBase 3.1.0 (r1-) (Built Apr 7 2021 08:14:49)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
```
(可选)验证集群
-----------------------------
连接 OceanBase 数据库,运行以下命令验证集群:
```sql
MySQL [oceanbase]> USE oceanbase;
MySQL [oceanbase]> SELECT * FROM __all_server;
```
返回以下结果:
```sql
+----------------------------+----------------------------+---------------+----------+----+-------+------------+-----------------+--------+-----------------------+--------------------------------+-----------+--------------------+--------------+----------------+-------------------+
| gmt_create | gmt_modified | svr_ip | svr_port | id | zone | inner_port | with_rootserver | status | block_migrate_in_time | build_version | stop_time | start_service_time | first_sessid | with_partition | last_offline_time |
+----------------------------+----------------------------+---------------+----------+----+-------+------------+-----------------+--------+-----------------------+--------------------------------+-----------+--------------------+--------------+----------------+-------------------+
| 2021-04-21 10:59:04.967158 | 2021-04-21 10:59:20.344774 | 11.166.80.01 | 2882 | 1 | zone1 | 2881 | 1 | active | 0 | 3.1.0_1-(Apr 7 2021 08:14:49) | 0 | 1618973957346877 | 0 | 1 | 0 |
| 2021-04-21 10:59:04.956632 | 2021-04-21 10:59:20.223340 | 11.166.80.02 | 2882 | 2 | zone2 | 2881 | 0 | active | 0 | 3.1.0_1-(Apr 7 2021 08:14:49) | 0 | 1618973958225270 | 0 | 1 | 0 |
| 2021-04-21 10:59:03.956853 | 2021-04-21 10:59:22.415147 | 11.166.81.103 | 2882 | 3 | zone3 | 2881 | 0 | active | 0 | 3.1.0_1-(Apr 7 2021 08:14:49) | 0 | 1618973958416271 | 0 | 1 | 0 |
+----------------------------+----------------------------+---------------+----------+----+-------+------------+-----------------+--------+-----------------------+--------------------------------+-----------+--------------------+--------------+----------------+-------------------+
3 rows in set (0.00 sec)
```
以上返回结果说明集群部署成功。

View File

@ -0,0 +1,447 @@
OceanBase 数据库通用问题排查方法
==========================================
OceanBase 数据库问题排查主要依赖进程日志、内部表以及代码的执行流程。本文介绍如何通过进程日志和内部表排查 OceanBase 数据库的通用问题。
进程日志
-------------------------
由于内部表的功能针对性较强,对于不明确的问题,我们推荐您优先使用进程日志排查问题。
OceanBase 数据库的进程日志分为 `observer.log``rootservice.log``election.log`。其中 `election.log` 记录选举相关日志,`rootservice.log` 记录 rootservice 模块的日志,`observer.log` 记录通用日志。
### 日志内容格式
OceanBase 数据库的进程日志格式如下:
```bash
[2021-06-11 16:30:02.372655] ERROR [BOOTSTRAP] bootstrap (ob_service.cpp:2656) [32075][428][YB420A27C94E-0005C47950223003] [lt=3] [dc=0] failed to prepare boot strap(rs_list=[region:"sys_region", zone:"z1", server:"127.0.0.1:2882",
region:"sys_region", zone:"z2", server:"127.0.0.2:2882", region:"sys_region", zone:"z3", server:"127.0.0.3:2882"], ret=-4012) BACKTRACE:0x90a107e 0x90090c1
0x24d1eef 0x24d1b3b 0x24d1900 0x66678b1 0x882bb40 0x8912d74 0x91c24f8 0x8a5d45f
0x8a5d08d 0x8a5841f 0x8a5770d 0x8a57b17 0x2a55b14 0x8ebc475 0x8eb9e4e 0x8eb46ef
```
其中,
* `[2021-06-11 16:30:02.372655]` 是时间戳。
* `ERROR` 是日志级别。日志级别有 `INFO``WARN``TRACE``DEBUG`
<!-- -->
* `[BOOTSTRAP]` 是模块名称,其他模块还有 SQL、STORAGE、COMMON 等。
* `bootstrap` 是函数名。
<!-- -->
* `ob_service.cpp:2656` 是文件名和行号。
* `[32075]` 是线程 ID。
<!-- -->
* `[428]` 是协程编号。
* `[YB420A27C94E-0005C47950223003]``trace_id`,同一个请求携带同一个 `trace_id`
<!-- -->
* `[lt=3]` 是日志前端格式化时间,通常无意义。
* `[dc=0]` 无意义。
<!-- -->
* `failed to prepare boot strap` 及之后内容是日志的具体内容。
* `ret=-4012` 表示错误码为 -4012,-4012 的语义是 `OB_TIMEOUT`,可以通过 `ob_errno.h` 查询。
* `BACKTRACE` 是调用栈的地址,可以通过 addr2line 等工具解析函数的调用栈。
### 日志名称格式
进程日志名称后缀中的数字表示该日志文件中最后一条日志的时间戳。例如,`observer.log.20210617143216` 后缀中的 `20210617143216` 表示该文件最后一条日志的时间戳是 `2021-06-17 14:32:16`
带有 `wf` 后缀的文件只记录 `WARN` 及以上级别的日志。您可以通过配置项 `enable_syslog_wf` 关闭 `wf` 日志。
更多日志文件的配置项请通过 `sys` 租户执行 `show parameters like '%syslog%'` 命令查看。
### TRACE 能力
OceanBase 数据库打印进程日志时会携带 `trace_id`,一个请求执行的整个生命周期都会携带同一个 `trace_id`,因此在进程日志中搜索 `trace_id` 可以拿到一个请求的全部执行过程。
**last_trace_id**
使用 `select last_trace_id();` 语句可以直接查看上一条语句的执行节点和 `trace_id`,然后在日志中运行 `grep` 命令查找相关信息。
```sql
obclient> SELECT last_trace_id();
+--------------------------------------------------------+
| last_trace_id() |
+--------------------------------------------------------+
| 127.0.0.1:2882, TraceId: YB427F000001-0005C4DB8B546938 |
+--------------------------------------------------------+
1 row in set (0.01 sec)
```
```bash
grep "YB427F000001-0005C4DB8B546938" observer.log
```
**trace_log**
OceanBase 数据库支持执行请求时打开 `trace_log`。您可以通过以下两种方式打开 `trace_log`
* 通过 Hint 中的` trace_log` 字段,这种方式只对携带 Hint 的当前语句生效。使用 Hint 要求 OBClient 在连接 OceanBase 数据库时携带 `-c` 选项,否则 Hint 会被忽略。更多 Hint 操作,参考 [Optimizer Hint](https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.0/optimizer-hint-1)。
* 通过 Session 变量 `ob_enable_trace_log`,这种方式对这个 Session 的后续所有语句生效。
打开 `trace_log` 后,通过 `SHOW TRACE` 语句可以拿到上一次的 `trace_log`,从而获取 `trace_id`。同时 `SHOW TRACE` 还可以看到这条请求大致的性能统计。
```sql
obclient> SHOW TRACE;
+------------------------------+----------------------------------------------------------------------------+------+
| Title | KeyValue | Time |
+------------------------------+----------------------------------------------------------------------------+------+
| process begin | in_queue_time:12, receive_ts:1623988240448815, enqueue_ts:1623988240448816 | 0 |
| query begin | trace_id:YC1E64586A5D-0005C4C77E56FA98 | 2 |
| parse begin | stmt:"select count(*) from t1", stmt_len:23 | 49 |
| pc get plan begin | | 7 |
| pc get plan end | | 18 |
| transform_with_outline begin | | 2 |
| transform_with_outline end | | 45 |
| resolve begin | | 22 |
| resolve end | | 130 |
| transform begin | | 40 |
| transform end | | 138 |
| optimizer begin | | 2 |
| get location cache begin | | 96 |
| get location cache end | | 108 |
| optimizer end | | 272 |
| cg begin | | 0 |
| cg end | | 984 |
| execution begin | arg1:false, end_trans_cb:false | 78 |
| do open plan begin | plan_id:197 | 29 |
| sql start stmt begin | | 1 |
| sql start stmt end | | 1 |
| execute plan begin | | 0 |
| execute plan end | | 9 |
| sql start participant begin | | 0 |
| sql start participant end | | 1 |
| do open plan end | | 0 |
| table scan begin | | 11 |
| table scan end | | 42 |
| start_close_plan begin | | 1344 |
| start_end_participant begin | | 13 |
| start_end_participant end | | 1 |
| start_close_plan end | | 1 |
| start_auto_end_plan begin | | 2 |
| start_auto_end_plan end | | 1 |
| execution end | | 2 |
| query end | | 52 |
| NULL | PHY_SCALAR_AGGREGATE | |
| t1 | PHY_TABLE_SCAN | |
+------------------------------+----------------------------------------------------------------------------+------+
38 rows in set (0.01 sec)
```
使用示例如下:
```sql
# 语句级
obclient> SELECT /*+ trace_log=on */c1 FROM t1 LIMIT 2;
obclient> SHOW TRACE;
# Session
obclient> SET ob_enable_trace_log = 'ON';
obclient> SELECT COUNT(*) FROM t1;
obclient> SHOW TRACE;
```
### 根据线程 ID 搜索日志
如果您未找到有效的 `trace_id`,或者 OceanBase 数据库的某些后台线程未设置 `trace_id`,您可以根据线程 ID 搜索日志。例如:
```bash
grep -F "[32075]" observer.log
```
内部表
------------------------
OceanBase 数据库的内部表比较多,本节仅介绍部分常见的通用表,其他类型的内部表(例如集群管控、性能视图、迁移复制、合并转储等)参考 [系统视图](../13.reference-guide/1.system-view/1.overview-4.md)。
本文中的内部表默认是 root 用户在 sys 租户的 OceanBase 数据库中可见的表(连接串示例:`obclient -u root@sys -D oceanbase`),下文不再指定数据库名称。
### 表的基础信息
您可以通过系统租户的 `__all_virtual_table` 表可以获取 `table_id``table_name` 等基本信息。
```sql
obclient> DESCRIBE __all_virtual_table;
+--------------------------------------+---------------------+------+-----+----------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------------+---------------------+------+-----+----------------+-------+
| tenant_id | bigint(20) | NO | PRI | NULL | |
| table_id | bigint(20) | NO | PRI | NULL | |
| gmt_create | timestamp(6) | NO | | NULL | |
| gmt_modified | timestamp(6) | NO | | NULL | |
| table_name | varchar(256) | NO | | | |
| database_id | bigint(20) | NO | | NULL | |
| table_type | bigint(20) | NO | | NULL | |
| load_type | bigint(20) | NO | | NULL | |
| def_type | bigint(20) | NO | | NULL | |
| rowkey_column_num | bigint(20) | NO | | NULL | |
| index_column_num | bigint(20) | NO | | NULL | |
| max_used_column_id | bigint(20) | NO | | NULL | |
| replica_num | bigint(20) | NO | | NULL | |
| autoinc_column_id | bigint(20) | NO | | NULL | |
| auto_increment | bigint(20) unsigned | YES | | 1 | |
| read_only | bigint(20) | NO | | NULL | |
| rowkey_split_pos | bigint(20) | NO | | NULL | |
| compress_func_name | varchar(128) | NO | | NULL | |
| expire_condition | varchar(4096) | NO | | NULL | |
| is_use_bloomfilter | bigint(20) | NO | | NULL | |
| comment | varchar(4096) | NO | | | |
| block_size | bigint(20) | NO | | NULL | |
| collation_type | bigint(20) | NO | | NULL | |
| data_table_id | bigint(20) | YES | | NULL | |
| index_status | bigint(20) | NO | | NULL | |
| tablegroup_id | bigint(20) | NO | | NULL | |
| progressive_merge_num | bigint(20) | NO | | NULL | |
| index_type | bigint(20) | NO | | NULL | |
| part_level | bigint(20) | NO | | NULL | |
| part_func_type | bigint(20) | NO | | NULL | |
| part_func_expr | varchar(4096) | NO | | NULL | |
| part_num | bigint(20) | NO | | NULL | |
| sub_part_func_type | bigint(20) | NO | | NULL | |
| sub_part_func_expr | varchar(4096) | NO | | NULL | |
| sub_part_num | bigint(20) | NO | | NULL | |
| create_mem_version | bigint(20) | NO | | NULL | |
| schema_version | bigint(20) | NO | | NULL | |
| view_definition | longtext | NO | | NULL | |
| view_check_option | bigint(20) | NO | | NULL | |
| view_is_updatable | bigint(20) | NO | | NULL | |
| zone_list | varchar(8192) | NO | | NULL | |
| primary_zone | varchar(128) | YES | | NULL | |
| index_using_type | bigint(20) | NO | | 0 | |
| parser_name | varchar(128) | YES | | NULL | |
| index_attributes_set | bigint(20) | YES | | 0 | |
| locality | varchar(4096) | NO | | | |
| tablet_size | bigint(20) | NO | | 134217728 | |
| pctfree | bigint(20) | NO | | 10 | |
| previous_locality | varchar(4096) | NO | | | |
| max_used_part_id | bigint(20) | NO | | -1 | |
| partition_cnt_within_partition_table | bigint(20) | NO | | -1 | |
| partition_status | bigint(20) | YES | | 0 | |
| partition_schema_version | bigint(20) | YES | | 0 | |
| max_used_constraint_id | bigint(20) | YES | | NULL | |
| session_id | bigint(20) | YES | | 0 | |
| pk_comment | varchar(4096) | NO | | | |
| sess_active_time | bigint(20) | YES | | 0 | |
| row_store_type | varchar(128) | YES | | FLAT_ROW_STORE | |
| store_format | varchar(128) | YES | | | |
| duplicate_scope | bigint(20) | YES | | 0 | |
| binding | tinyint(4) | YES | | 0 | |
| progressive_merge_round | bigint(20) | YES | | 0 | |
| storage_format_version | bigint(20) | YES | | 2 | |
| table_mode | bigint(20) | NO | | 0 | |
| encryption | varchar(128) | YES | | | |
| tablespace_id | bigint(20) | NO | | -1 | |
| drop_schema_version | bigint(20) | NO | | -1 | |
| is_sub_part_template | tinyint(4) | NO | | 1 | |
| dop | bigint(20) | NO | | 1 | |
| character_set_client | bigint(20) | NO | | 0 | |
| collation_connection | bigint(20) | NO | | 0 | |
| auto_part_size | bigint(20) | NO | | -1 | |
| auto_part | tinyint(4) | NO | | 0 | |
+--------------------------------------+---------------------+------+-----+----------------+-------+
73 rows in set (0.00 sec)
```
### Location 信息
OceanBase 数据库是分布式数据库,与传统数据库相比,需要 Location 信息来定位处理请求的具体节点。OceanBase 数据库使用 Paxos 协议做副本同步,对于 DML 请求和 Read Latest 类型的查询,都会路由到目标分区的 Leader 节点处理。
Location 信息分为三级,即核心表 `__all_core_table`(系统租户的 1 号表)的位置,系统表的位置,普通表的位置。location 信息相关的内部表中,`role` 字段为 1 表示 Leader,2 表示 Follower。
* 核心表的位置信息可以通过系统租户的 `__all_virtual_core_meta_table` 表来查询,核心表所在的 OceanBase 数据库节点是 rootserver,所以也可以通过 `__all_server` 表的 `with_rootserver` 字段找到核心表 Leader 的位置。
* 系统表的位置信息可以通过系统租户的 `__all_root_table` 查询。
<!-- -->
* 普通表的位置信息可以通过 `meta_table` 表查询,对于系统租户,可以查询 `__all_virtual_meta_table`。对于普通租户,可以查询 `__all_tenant_meta_table`
### sql_audit
OceanBase 数据库支持 SQL 监控,可以通过配置项 `enable_sql_audit`(默认打开)和 Session 变量 `ob_enable_sql_audit`(默认打开)控制。监控信息存储在 `gv$sql_audit` 视图中。您通过 `query_sql` 等字段搜索目标 SQL 语句的监控记录获取 `trace_id`、执行时间、返回行数等信息。
`sql_audit` 表的容量有限,早期的记录可能会被后来的请求覆盖,`sql_audit` 表的容量可以通过配置项 `sql_audit_queue_size``sql_audit_memory_limit` 以及 Session 变量 `ob_sql_audit_percentage` 设置。
```sql
obclient> select * from gv$sql_audit where query_sql like 'select count(*) from t1%'\G
*************************** 1. row ***************************
SVR_IP: 127.0.0.1
SVR_PORT: 3102
REQUEST_ID: 20
SQL_EXEC_ID: 12803933
TRACE_ID: YC1E64586A5D-0005C4C77E56FA98
SID: 3221639668
CLIENT_IP: 127.0.0.1
CLIENT_PORT: 38101
TENANT_ID: 1001
TENANT_NAME: my_tenant
EFFECTIVE_TENANT_ID: 1001
USER_ID: 1100611139404777
USER_NAME: my_user
USER_GROUP: 0
USER_CLIENT_IP: 127.0.0.1
DB_ID: 1100611139404776
DB_NAME: test
SQL_ID: 69AE2D9E3BF106CE009F93EFAF925EC8
QUERY_SQL: select count(*) from t1
PLAN_ID: 197
AFFECTED_ROWS: 0
RETURN_ROWS: 1
PARTITION_CNT: 1
RET_CODE: 0
QC_ID: 0
DFO_ID: 0
SQC_ID: 0
WORKER_ID: 0
EVENT: system internal wait
P1TEXT:
P1: 0
P2TEXT:
P2: 0
P3TEXT:
P3: 0
LEVEL: 0
WAIT_CLASS_ID: 100
WAIT_CLASS#: 0
WAIT_CLASS: OTHER
STATE: MAX_WAIT TIME ZERO
WAIT_TIME_MICRO: 0
TOTAL_WAIT_TIME_MICRO: 0
TOTAL_WAITS: 0
RPC_COUNT: 0
PLAN_TYPE: 1
IS_INNER_SQL: 0
IS_EXECUTOR_RPC: 0
IS_HIT_PLAN: 0
REQUEST_TIME: 1623988240448815
ELAPSED_TIME: 3465
NET_TIME: 0
NET_WAIT_TIME: 0
QUEUE_TIME: 20
DECODE_TIME: 1
GET_PLAN_TIME: 1960
EXECUTE_TIME: 1460
APPLICATION_WAIT_TIME: 0
CONCURRENCY_WAIT_TIME: 0
USER_IO_WAIT_TIME: 0
SCHEDULE_TIME: 0
ROW_CACHE_HIT: 0
BLOOM_FILTER_CACHE_HIT: 0
BLOCK_CACHE_HIT: 0
BLOCK_INDEX_CACHE_HIT: 0
DISK_READS: 0
RETRY_CNT: 0
TABLE_SCAN: 1
CONSISTENCY_LEVEL: 3
MEMSTORE_READ_ROW_COUNT: 1
SSSTORE_READ_ROW_COUNT: 0
REQUEST_MEMORY_USED: 2096128
EXPECTED_WORKER_COUNT: 0
USED_WORKER_COUNT: 0
SCHED_INFO:
FUSE_ROW_CACHE_HIT: 0
PS_STMT_ID: 0
TRANSACTION_HASH: 0
REQUEST_TYPE: 2
IS_BATCHED_MULTI_STMT: 0
OB_TRACE_INFO:
PLAN_HASH: 2598000370345801882
LOCK_FOR_READ_TIME: 0
WAIT_TRX_MIGRATE_TIME: 0
1 row in set (0.65 sec)
```

View File

@ -0,0 +1,84 @@
数据库操作
==========================
本节主要提供数据库的创建、查看、修改和删除示例。
创建数据库
--------------------------
使用 `CREATE DATABASE` 语句创建数据库。
示例如下:
* 创建数据库 `test2`,并指定字符集为 `UTF8`
```sql
obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
```
* 创建读写属性的数据库 `test3`。
```sql
obclient> CREATE DATABASE test3 READ WRITE;
Query OK, 1 row affected (0.03 sec)
```
更多 `CREATE DATABASE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [CREATE DATABASE](../../10.sql-reference/5.sql-statement/11.create-database.md)章节。
查看数据库
--------------------------
使用 `SHOW DATABASES` 语句查看数据库。
示例如下:
```sql
obclient> SHOW DATABASES;
```
修改数据库
--------------------------
使用 `ALTER DATABASE` 语句来修改 DataBase 数据库的属性。
示例如下:
修改数据库 `test2` 的字符集为 `UTF8MB4`,校对规则为 `UTF8MB4_BIN`,且为读写属性。
```sql
obclient> ALTER DATABASE test2 DEFAULT CHARACTER SET UTF8MB4;
obclient> ALTER DATABASE test2 DEFAULT COLLATE UTF8MB4_BIN;
obclient> ALTER DATABASE test2 READ WRITE;
```
更多 `ALTER DATABASE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [ALTER DATABASE](../../10.sql-reference/5.sql-statement/2.alter-database.md)章节。
删除数据库
--------------------------
使用 `DROP DATABASE` 语句删除数据库。
示例如下:
```sql
obclient> DROP DATABASE my_db;
```
更多 `DROP DATABASE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [DROP DATABASE](../../10.sql-reference/5.sql-statement/24.drop-database.md)章节。

View File

@ -0,0 +1,188 @@
表操作
========================
本节主要提供数据库表的创建、查看、修改和删除示例。
创建表
------------------------
使用 `CREATE TABLE` 语句在数据库中创建新表。
示例如下:
```sql
obclient> CREATE TABLE test (c1 int primary key, c2 VARCHAR(3));
```
更多 `CREATE TABLE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [CREATE TABLE](../../10.sql-reference/5.sql-statement/18.create-table.md)章节。
查看表
------------------------
使用 `SHOW CREATE TABLE` 语句查看建表语句。
示例如下:
```sql
obclient> SHOW CREATE TABLE test;
```
使用 `SHOW TABLES` 语句查看指定数据库中的所有表。
示例如下:
```sql
obclient> SHOW TABLES FROM my_db;
```
修改表
------------------------
使用 `ALTER TABLE` 语句来修改已存在的表的结构,包括修改表及表属性、新增列、修改列及属性、删除列等。
示例如下:
* 把表 `test` 的字段 `c2` 改名为 `c3`,并同时修改其字段类型。
```sql
obclient> DESCRIBE test;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(3) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
obclient> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10);
Query OK, 0 rows affected (0.08 sec)
obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c3 | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
```
* 增加、删除列
* 增加列前,执行 `DESCRIBE test``;` 命令查看表信息。
```sql
obclient> DESCRIBE test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(3) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
```
* 执行以下命令,增加 `c3` 列。
```sql
obclient> ALTER TABLE test ADD c3 int;
Query OK, 0 rows affected (0.08 sec)
```
* 增加列后,执行 `DESCRIBE test;` 命令查看表信息。
```sql
obclient> DESCRIBE test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(3) | YES | | NULL | |
| c3 | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```
* 执行以下命令,删除 `c3` 列。
```sql
obclient> ALTER TABLE test DROP c3;
Query OK, 0 rows affected (0.08 sec)
```
* 删除列后,执行 `DESCRIBE test;` 命令查看表信息。
```sql
obclient> DESCRIBE test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
```
* 设置表 `test` 的副本数,并且增加列 `c5`。
```sql
obclient> ALTER TABLE test SET REPLICA_NUM=2, ADD COLUMN c5 INT;
Query OK, 0 rows affected (0.06 sec)
obclient> DESCRIBE test;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(3) | YES | | NULL | |
| c5 | int(11) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
```
更多 `ALTER TABLE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [ALTER TABLE](../../10.sql-reference/5.sql-statement/7.alter-table.md) 章节。
删除表
------------------------
使用 `DROP TABLE` 语句删除表。
示例如下:
```sql
obclient> DROP TABLE test;
```
或者
```sql
obclient> DROP TABLE IF EXISTS test;
```
更多 `DROP TABLE` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [DROP TABLE](../../10.sql-reference/5.sql-statement/30.drop-table.md)章节。

View File

@ -0,0 +1,65 @@
索引操作
=========================
索引是创建在表上并对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库系统的性能开销。
创建索引
-------------
使用 `CREATE INDEX` 语句创建表的索引。
示例:
1. 执行以下命令,创建表 `test`
```sql
obclient> CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
```
2. 执行以下命令,创建表 test 的索引。
```sql
obclient> CREATE INDEX test_index ON test (c1, c2);
```
更多 `CREATE INDEX` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中的 [CREATE INDEX](../../10.sql-reference/5.sql-statement/12.create-index.md)章节。
查看索引
-------------
使用 `SHOW INDEX` 语句查看表的索引。
示例如下:
查看表 `test` 的索引。
```sql
obclient> SHOW INDEX FROM test;
```
删除索引
-------------
使用 `DROP INDEX` 语句删除表的索引。
示例如下:
删除表 `test` 的索引。
```sql
obclient> DROP INDEX test_index ON test;
```
更多 `DROP INDEX` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中的 [DROP INDEX](../../10.sql-reference/5.sql-statement/25.drop-index.md)章节。

View File

@ -0,0 +1,57 @@
插入数据
=========================
使用 `INSERT` 语句在已经存在的表中插入数据。
示例如下:
假设有如下所示数据的表 `t1`
```sql
obclient> CREATE TABLE t1(c1 int primary key, c2 int) partition BY key(c1) partitions 4;
Query OK, 0 rows affected (0.11 sec)
```
* 向表 t1 中插入一行数据。
```sql
obclient> INSERT INTO t1 VALUES(1,1);
Query OK, 1 row affected (0.01 sec)
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.04 sec)
```
* 向表 t1 中插入多行数据。
```sql
obclient> INSERT t1 VALUES(1,1),(2,default),(2+2,3*4);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | NULL |
| 4 | 12 |
+----+------+
3 rows in set (0.02 sec)
```
更多 `INSERT `语句相关的语法请参见《SQL 参考(MySQL 模式)》中 [INSERT](../../10.sql-reference/5.sql-statement/41.INSERT.md)章节。

View File

@ -0,0 +1,159 @@
删除数据
=========================
使用 DELETE 语句删除数据。
示例如下:
假设有如下所示数据的表 `t1``t2`。其中,表 `t2` 为 KEY 分区表,且分区名由系统根据分区命令规则自动生成,即分区名为 `p0``p1``p2``p3`
```sql
obclient> CREATE TABLE t1(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.16 sec)
obclient> INSERT t1 VALUES(1,1),(2,2),(3,3),(4,4);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.06 sec)
obclient> CREATE TABLE t2(c1 int primary key, c2 int) partition BY key(c1) partitions 4;
Query OK, 0 rows affected (0.19 sec)
obclient> INSERT INTO t2 VALUES(5,5),(1,1),(2,2),(3,3);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
4 rows in set (0.02 sec)
```
* 单表删除,删除 `c1=2` 的行,其中 `c1` 列为表 `t1` 中的 Primary Key。
```sql
obclient> DELETE FROM t1 WHERE c1 = 2;
Query OK, 1 row affected (0.02 sec)
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 3 | 3 |
| 4 | 4 |
+----+------+
3 rows in set (0.01 sec)
```
* 单表删除,删除表 `t1` 中按照 `c2` 列排序之后的第一行数据。
```sql
obclient> DELETE FROM t1 ORDER BY c2 LIMIT 1;
Query OK, 1 row affected (0.01 sec)
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
3 rows in set (0.00 sec)
```
* 单表删除,删除表 `t2` 的 `p2` 分区的数据。
```sql
obclient> SELECT * FROM t2 PARTITION(p2);
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
obclient> DELETE FROM t2 PARTITION(p2);
Query OK, 3 rows affected (0.02 sec)
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
+----+------+
1 row in set (0.02 sec)
```
* 多表删除,删除 `t1`、`t2` 表中 `t1.c1 = t2.c1` 的数据。
```sql
obclient> DELETE t1, t2 FROM t1, t2 WHERE t1.c1 = t2.c1;
Query OK, 3 rows affected (0.02 sec)
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 4 | 4 |
+----+------+
1 row in set (0.01 sec)
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
+----+------+
1 row in set (0.01 sec)
```
* 多表删除,删除 `t1`、`t2` 表中 `t1.c1 = t2.c1` 的数据。
```sql
obclient> DELETE FROM t1, t2 USING t1, t2 WHERE t1.c1 = t2.c1;
Query OK, 4 rows affected (0.02 sec)
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 4 | 4 |
+----+------+
1 row in set (0.01 sec)
obclient> SELECT * FROM t2;
Empty set (0.01 sec)
```
更多 `DELETE `语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [DELETE](../../10.sql-reference/5.sql-statement/23.DELETE.md)章节。

View File

@ -0,0 +1,153 @@
更新数据
=========================
使用 `UPDATE` 语句修改表中的字段值。
示例如下:
创建示例表 `t1``t2`
```sql
obclient> CREATE TABLE t1(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.16 sec)
obclient> INSERT t1 VALUES(1,1),(2,2),(3,3),(4,4);
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.06 sec)
obclient> CREATE TABLE t2(c1 int primary key, c2 int) partition by key(c1) partitions 4;
Query OK, 0 rows affected(0.19 sec)
obclient> INSERT t2 VALUES(5,5),(1,1),(2,2),(3,3);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
4 rows in set (0.02 sec)
```
* 将表 `t1``t1.c1=1` 对应的那一行数据的 `c2` 列值修改为 `100`
```sql
obclient> UPDATE t1 SET t1.c2 = 100 WHERE t1.c1 = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```
* 将表 `t1` 中按照 `c2` 列排序的前两行数据的 `c2` 列值修改为 `100`。
```sql
obclient> UPDATE t1 set t1.c2 = 100 ORDER BY c2 LIMIT 2;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```
* 将表 `t2` 中 `p2` 分区的数据中 `t2.c1 > 2` 的对应行数据的 `c2` 列值修改为 `100`。
```sql
obclient> SELECT * FROM t2 partition (p2);
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
obclient> UPDATE t2 partition(p2) SET t2.c2 = 100 WHERE t2.c1 > 2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
obclient> SELECT * FROM t2 partition (p2);
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 100 |
+----+------+
3 rows in set (0.00 sec)
```
* 修改多个表。对于表 `t1` 和表 `t2` 中满足 `t1.c2 = t2.c2` 对应行的数据,将表 `t1` 中的 `c2` 列值修改为 `100`,表 `t2` 中的 `c2` 列值修改为 `200`。
```sql
obclient> UPDATE t1,t2 SET t1.c2 = 100, t2.c2 = 200 WHERE t1.c2 = t2.c2;
Query OK, 6 rows affected (0.03 sec)
Rows matched: 6 Changed: 6 Warnings: 0
obclient> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 4 |
+----+------+
4 rows in set (0.00 sec)
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 200 |
| 2 | 200 |
| 3 | 200 |
+----+------+
4 rows in set (0.01 sec)
```
更多 `UPDATE` 语句相关的语法请参见《SQL 参考(MySQL 模式)》中 [UPDATE](../../10.sql-reference/5.sql-statement/61.UPDATE.md)章节。

View File

@ -0,0 +1,81 @@
查询数据
=========================
使用 `SELECT` 语句查询表中的内容。
示例如下:
假设有如下所示数据的表 `a`
```sql
obclient> CREATE TABLE a (id int, name varchar(50), num int);
Query OK, 0 rows affected (0.07 sec)
obclient> INSERT INTO a VALUES(1,'a',100),(2,'b',200),(3,'a',50);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM a;
+------+------+------+
| ID | NAME | NUM |
+------+------+------+
| 1 | a | 100 |
| 2 | b | 200 |
| 3 | a | 50 |
+------+------+------+
3 rows in set (0.00 sec)
```
1. 从表 `a` 中读取 `name` 的数据。
```sql
obclient> SELECT name FROM a;
+------+
| NAME |
+------+
| a |
| b |
| a |
+------+
3 rows in set (0.00 sec)
```
2. 在查询结果中对 `name` 进行去重处理。
```sql
obclient> SELECT DISTINCT name FROM a;
+------+
| NAME |
+------+
| a |
| b |
+------+
2 rows in set (0.01 sec)
```
3. 从表 `a` 中根据筛选条件 `name = 'a'` ,输出对应的 `id` 、`name` 和 `num`。
```sql
obclient> SELECT id, name, num FROM a WHERE name = 'a';
+------+------+------+
| ID | NAME | NUM |
+------+------+------+
| 1 | a | 100 |
| 3 | a | 50 |
+------+------+------+
2 rows in set (0.00 sec)
```
更多 `SELECT` 语句相关的语法说明请参见《SQL 参考(MySQL 模式)》中 [SELECT](../../10.sql-reference/5.sql-statement/54.SELECT.md)章节。

View File

@ -0,0 +1,61 @@
提交事务
=========================
使用 `COMMIT` 语句提交事务。
在提交事务(`COMMIT`)之前:
* 您的修改只对当前会话可见,对其他数据库会话均不可见。
* 您的修改没有持久化,您可以通过 `ROLLBACK` 语句撤销修改。
在提交事务(`COMMIT`)之后:
* 您的修改对所有数据库会话可见。
* 您的修改持久化成功,不能通过 `ROLLBACK` 语句回滚修改。
示例如下:
```sql
obclient> INSERT INTO t_insert(id,name) VALUES(4,'JP');
Query OK, 1 row affected (0.01 sec)
obclient> COMMIT;
Query OK, 0 rows affected (0.00 sec)
obclient> exit;
Bye
[user@host ~]$obclient -h192.168.1.101 -utpcc@obbmsql#obdemo -P2883 -p123456 TPCC
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2020-04-02 17:52:31 |
| 2 | US | 10002 | 2020-04-02 17:52:38 |
| 3 | EN | 10003 | 2020-04-02 17:52:38 |
| 4 | JP | NULL | 2020-04-02 17:53:34 |
+----+------+-------+---------------------+
4 rows in set (0.00 sec)
```
更多事务控制语句相关的说明请参见 [关于事务控制语句](../../7.developer-guide-1/3.about-dml-statements-and-transactions/2.about-transactional-control-statements.md)。

View File

@ -0,0 +1,108 @@
回滚事务
=========================
使用 `ROLLBACK` 语句回滚事务。
回滚一个事务指将事务的修改全部撤销。可以回滚当前整个未提交的事务,也可以回滚到事务中任意一个保存点。如果要回滚到某个保存点,必须结合使用 `ROLLBACK``TO SAVEPOINT` 语句。
其中:
* 如果回滚整个事务,则:
* 事务会结束
* 所有的修改会被丢弃
* 清除所有保存点
* 释放事务持有的所有锁
* 如果回滚到某个保存点,则:
* 事务不会结束
* 保存点之前的修改被保留,保存点之后的修改被丢弃
* 清除保存点之后的保存点(不包括保存点自身)
* 释放保存点之后事务持有的所有锁
示例如下:
回滚事务的全部修改:
```sql
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2020-04-02 17:52:31 |
| 2 | US | 10002 | 2020-04-02 17:52:38 |
| 3 | EN | 10003 | 2020-04-02 17:52:38 |
+----+------+-------+---------------------+
3 rows in set (0.00 sec)
obclient> INSERT INTO t_insert(id, name, value) VALUES(4,'JP',10004);
Query OK, 1 row affected (0.00 sec)
obclient> INSERT INTO t_insert(id, name, value) VALUES(5,'FR',10005),(6,'RU',10006);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2020-04-02 17:52:31 |
| 2 | US | 10002 | 2020-04-02 17:52:38 |
| 3 | EN | 10003 | 2020-04-02 17:52:38 |
| 4 | JP | 10004 | 2020-04-02 17:53:34 |
| 5 | FR | 10005 | 2020-04-02 17:54:53 |
| 6 | RU | 10006 | 2020-04-02 17:54:53 |
+----+------+-------+---------------------+
6 rows in set (0.00 sec)
obclient> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
obclient> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2020-04-02 17:52:31 |
| 2 | US | 10002 | 2020-04-02 17:52:38 |
| 3 | EN | 10003 | 2020-04-02 17:52:38 |
+----+------+-------+---------------------+
3 rows in set (0.00 sec)
```
更多事务控制语句相关的说明请参见 [关于事务控制语句](../../7.developer-guide-1/3.about-dml-statements-and-transactions/2.about-transactional-control-statements.md)。