DMDPC是基于达梦数据库管理系统研发的一款同时支持在线分析处理和在线事务处理的新型分布式数据库系统。它既具备传统单机数据库的绝大部分功能,又提供了分布式计算集群才拥有的高可用、高扩展、高性能、高吞吐量和对用户透明等高级特性。DMDPC 架构旨在提供具有分布式特性的可扩展、高性能数据库解决方案,以满足具有高并发、大规模数据存储、业务快速扩张等特征的用户业务对数据库的要求。
一个完整的 DMDPC 架构由计划生成节点 SP、数据存储节点BP和元数据服务器节点MP 三部分组成。
SP 对外提供分布式数据库服务,用户可以登录到任意一个 SP 节点,获得完整的数据库服务,SP节点不存储数据,配置成单机即可。
BP负责存储数据,执行SP的调度指令并将执行结果返回给 SP;
MP负责存储元数据并向SP、BP提供元数据服务。
MP和BP节点既可以配置成单机,也可以配置成多副本系统。其中每一个多副本系统中只有一个作为主节点,其余节点均作为备份节点。
左侧为单机DMDPC,右侧为配有多副本系统的DMDPC。
计划生成节点,英文全称为 SQL Processor,简称为 SP。
SP 为 DMDPC 集群中对外提供数据库服务的节点,负责接收用户请求并生成计划、划分子计划、按照一定规则计算并行度并调度各个子计划,并最终将执行结果返回给用户。对于一次客户端请求任务来说,客户端连接的SP负责生成、划分并调度计划,其它的SP和BP负责执行计划。
SP的实现是在已有的成熟达梦单机数据库处理框架的基础上新增了分布式计算处理。因此 SP 具备以下特征:
- 全部的SQL标准支持:包括复杂关联查询、存储过程、视图、序列等某些分布式数据库难以支持的特性。
- SP节点自身无状态:每个SP节点上不存储任何数据字典信息和用户数据,一个集群中可以存在多个 SP 节点。连接上任何一个 SP 节点都可以获得完整的数据库服务。
- SP具备子计划的执行能力:因为SP和BP是由同一套代码编译出来的,只是不同的启动参数决定了担任不同的角色,所以SP和BP一样具有操作符的执行能力。例如:从资源均衡利用和计算存储分离角度来考虑,DMDPC 将部分子计划安排在SP上执行。
- 支持动态增删节点。
数据存储节点,英文全称为 Backend Processor,简称为 BP。
BP为DMDPC集群中数据实际存储的节点,负责存储数据和接收SP的子任务调度指令,执行子任务,并返回结果给 SP。
一个 DMDPC 集群可配置多个BP节点同时提供服务,且可以随着用户业务量变化动态增删BP节点。为了保障BP节点能够持续提供服务,每一个BP节点又可以配置成一个BP多副本系统。
元数据服务器节点,英文全称为 Metadata Processor,简称为MP。
MP为DMDPC集群中提供元数据服务(即字典信息服务)的节点。所有DDL请求都会经过SP转发给MP执行,元数据信息全部存储在MP。一个DMDPC集群只能配置一个MP节点提供服务。为了保障 MP节点能持续提供服务,MP节点可以配置成一个 MP多副本系统。
在现实环境中,DMDPC运行过程中有可能会碰到各种故障情况,比如系统掉电、硬件故障(如磁盘损坏)、自然灾害(地震、火灾)等意外情况,因此需要对BP或MP采用多副本系统架构进行存储,以保障DMDPC的数据安全和高可用性,避免出现数据损坏和丢失,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。
DM多副本系统由N个节点实例组成,N必须是大于1的奇数。只有配置了RAFT归档的实例才能加入多副本系统。
目前一个多副本系统最多支持部署9个节点实例。同一个RAFT 组中的所有节点(三个或三个以上)共同构成一个多副本系统。实例之间通过XMAL模块进行TCP 消息通讯。各个节点实例之间基于RAFT协议选举出一个领导者作为主库,其他实例作为备库(也就是副本)角色运行。主库会自动向备库同步日志,备库接收并重新应用日志,从而达到主备库之间数据保持一致的目的。
-
- BP多副本架构
上图展示了三个BP域的集群架构,每个BP域中都包含多个BP。同一个RAFT组的多个BP保存了同样数据的多个副本。例如:BP1、BP1’和 BP1”三者内容完全相同。同一个 RAFT 组中的所有BP节点共同构成一个BP多副本系统。同一个 RAFT 组中的多个副本中只有一个作为主节点对外提供服务,其余节点均作为备份节点。当主节点发生故障后,系统会从备份节点中(BP1’,BP1”)重新选举出新的主节点对外提供服务。
在 BP 多副本系统中,可通过 V$ARCH_STATUS 和 V$RLOG_RAFT_INFO 来查看整个系统中主备环境的运行状况。
-
- MP多副本架构
上图展示了三个MP域的集群架构,每个MP域中最多只包含1个MP。同一个RAFT组的多个MP保存了同样数据的多个副本。例如:MP1、MP1’和 MP1”三者内容完全相同。同一个 RAFT 中的三个MP节点共同构成一个MP多副本系统。同一个RAFT组中的多个副本中只有一个作为主节点对外提供服务,其余节点均作为备份节点。当主节点发生故障后,系统会从备份节点中(MP1’, MP1”)重新选举出新的主节点对外提供服务。
在MP多副本系统中,可通过 V$ARCH_STATUS 和 V$RLOG_RAFT_INFO 来查看整个系统中主备环境的运行状况。
- DM8DPC单机架构部署(BP无副本)
- DMDPC单机架构说明
一个最小的DMDPC集群包含一个BP、一个SP 和一个MP。可以在部署完毕后随时增添新的BP、SP节点。至少需要两台BP才方便看出子任务的各种计划形态和调度。
Windows和Linux 环境下部署 DMDPC 集群并无区别,目前支持借助命令行工具部署和DEM图形化界面方式部署两种方式。
-
- DMDPC单机架构规划
DMDPC集群规划部署1个SP,1个MP 和2个BP。其中,BP采用单机模式,未配置为多副本系统。
IP和端口分配如下表:
#Linux
RAFT 组名 | 角色 | 实例名称 | IP | PORT_NUM | AP_PORT_NUM | 路径 |
RAFT_SP1 | SP | SP1 | 84.0.191.30 | 5236 | 6000 | /dm8/data/sp1 |
RAFT_1 | BP | BP1 | 84.0.191.30 | 5237 | 6001 | /dm8/data/bp1 |
RAFT_2 | BP | BP2 | 84.0.191.30 | 5238 | 6002 | /dm8/data/bp2 |
缺省为 NULL 或者 MP_RAFT | MP | MP1 | 84.0.191.30 | 5239 | 6003 | /dm8/data/mp1 |
#Windows
RAFT 组名 | 角色 | 实例名称 | IP | PORT_NUM | AP_PORT_NUM | 路径 |
RAFT_SP1 | SP | SP1 | 84.0.191.30 | 5236 | 6000 | d:\dpc_data\sp1 |
RAFT_1 | BP | BP1 | 84.0.191.30 | 5237 | 6001 | d:\dpc_data\bp1 |
RAFT_2 | BP | BP2 | 84.0.191.30 | 5238 | 6002 | d:\dpc_data\bp2 |
缺省为 NULL 或者 MP_RAFT | MP | MP1 | 84.0.191.30 | 5239 | 6003 | d:\dpc_data\mp1 |
只安装soft不建实例。
[root@dm8dpc]# mount -o loop /soft/dm8_20231109_x86_kylin10_64.iso /mnt
[root@dm8dpc soft]# su - dmdba
dm8dpc>$cd /mnt
dm8dpc>$./DMInstall.bin -i
请以root系统用户执行命令:
/dm8/dmdbms/script/root/root_installer.sh
安装结束
[root@dm8dpc ~]# /dm8/dmdbms/script/root/root_installer.sh
#Linux
dm8dpc>$mkdir -p /dm8/data/sp1
dm8dpc>$mkdir -p /dm8/data/mp1
dm8dpc>$mkdir -p /dm8/data/bp1
dm8dpc>$mkdir -p /dm8/data/bp2
#Windows
C:\>md d:\dpc_data\sp1
C:\>md d:\dpc_data\mp1
C:\>md d:\dpc_data\bp1
C:\>md d:\dpc_data\bp2
初始化 4 个数据库实例,实例名称分别为 SP1、BP1、BP2 和 MP1。
#linux
dminit path=/dm8/data/sp1 instance_name=SP1 port_num=5236 ap_port_num=6000 dpc_mode=SP
dminit path=/dm8/data/bp1 instance_name=BP1 port_num=5237 ap_port_num=6001 dpc_mode=BP
dminit path=/dm8/data/bp2 instance_name=BP2 port_num=5238 ap_port_num=6002 dpc_mode=BP
dminit path=/dm8/data/mp1 instance_name=MP1 port_num=5239 ap_port_num=6003 dpc_mode=MP
其它:
#SP1
dminit path=/dm8/data/sp1 EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDBSP1 PORT_NUM=5236 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/sp1/log ap_port_num=6000 dpc_mode=SP
#BP1
dminit path=/dm8/data/bp1 EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDBBP1 PORT_NUM=5237 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/bp1/log ap_port_num=6001 dpc_mode=BP
#BP2
dminit path=/dm8/data/bp2 EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDBBP2 PORT_NUM=5238 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/bp2/log ap_port_num=6002 dpc_mode=BP
#MP1
dminit path=/dm8/data/mp1 EXTENT_SIZE=16 PAGE_SIZE=32 case_sensitive=1 charset=1 log_size=2048 db_name=CUGDB instance_name=CUGDBMP1 PORT_NUM=5239 LENGTH_IN_CHAR=1 BLANK_PAD_MODE=0 SYSDBA_PWD="SYSDBA2023" SYSAUDITOR_PWD="SYSDBA2023" ELOG_PATH=/dm8/data/mp1/log ap_port_num=6003 dpc_mode=MP
#windows
dminit path=d:\dpc_data\sp1 instance_name=SP1 port_num=5236 ap_port_num=6000 dpc_mode=SP
dminit path=d:\dpc_data\bp1 instance_name=BP1 port_num=5237 ap_port_num=6001 dpc_mode=BP
dminit path=d:\dpc_data\bp2 instance_name=BP2 port_num=5238 ap_port_num=6002 dpc_mode=BP
dminit path=d:\dpc_data\mp1 instance_name=MP1 port_num=5239 ap_port_num=6003 dpc_mode=MP
-
-
- 为 SP、BP 和 MP 配置 MP.INI 文件
-
为 SP、BP 和 MP 实例配置 MP.INI 文件。
MP.INI 文件内容如下:
mp_host = 84.0.191.30
mp_port = 9000 #与MP、BP和SP上的ap_port_num不冲突的端口号
将 MP.INI 文件内容分别写入 SP(SP1)、BP(BP1、BP2)和 MP1 中。打开 cmd 命令行工具执行:
-
-
-
- SP1配置MP.INI文件
-
-
#Linux
#与MP、BP和SP上的ap_port_num不冲突的端口号
cat >> /dm8/data/sp1/CUGDB/mp.ini << EOF
mp_host = 84.0.191.30
mp_port = 9000
EOF
#Windows
#与MP、BP和SP上的ap_port_num不冲突的端口号
echo mp_host = 84.0.191.30 > d:\dpc_data\sp1\CUGDB\mp.ini
echo mp_port = 9000 >> d:\dpc_data\sp1\CUGDB\mp.ini
-
-
-
- BP1配置MP.INI文件
-
-
#Linux
#与MP、BP和SP上的ap_port_num不冲突的端口号
cat >> /dm8/data/bp1/CUGDB/mp.ini << EOF
mp_host = 84.0.191.30
mp_port = 9000
EOF
#Windows
#与MP、BP和SP上的ap_port_num不冲突的端口号>>
echo mp_host = 84.0.191.30 > d:\dpc_data\bp1\CUGDB\mp.ini
echo mp_port = 9000 >> d:\dpc_data\bp1\CUGDB\mp.ini
-
-
-
- BP2配置MP.INI文件
-
-
#Linux
#与MP、BP和SP上的ap_port_num不冲突的端口号
cat >> /dm8/data/bp2/CUGDB/mp.ini << EOF
mp_host = 84.0.191.30
mp_port = 9000
EOF
#Windows
#与MP、BP和SP上的ap_port_num不冲突的端口号
echo mp_host = 84.0.191.30 > d:\dpc_data\bp2\CUGDB\mp.ini
echo mp_port = 9000 >> d:\dpc_data\bp2\CUGDB\mp.ini
-
-
-
- MP1配置MP.INI文件
-
-
#Linux
#与MP、BP和SP上的ap_port_num不冲突的端口号
cat >> /dm8/data/mp1/CUGDB/mp.ini << EOF
mp_host = 84.0.191.30
mp_port = 9000
EOF
#Windows
#与MP、BP和SP上的ap_port_num不冲突的端口号
echo mp_host = 84.0.191.30 > d:\dpc_data\mp1\CUGDB\mp.ini
echo mp_port = 9000 >> d:\dpc_data\mp\CUGDB\mp.ini
#Linux
dm8dpc>$dmserver /dm8/data/mp1/CUGDB/dm.ini dpc_mode=MP
后台启动
dm8dpc>$mkdir -p /dm8/script
dm8dpc>$vi /dm8/script/dmmpstart.sh
dmserver /dm8/data/mp1/CUGDB/dm.ini dpc_mode=MP
dm8dpc>$chmod +x dmmpstart.sh
dm8dpc>$./dmmpstart.sh &
dm8dpc>$ps -ef | grep dm
#Windows
dmserver d:\dpc_data\mp1\CUGDB\dm.ini dpc_mode=MP
DMDPC 运行过程中,MP 需要始终处于开启状态。
-
-
- 将 MP、SP 和 BP 加入集群
-
增加 1 个 MP、1 个 SP 和 2 个 BP 节点。只有在注册当前登录 MP 节点后,才可以注册其余节点。后续增加 MP、SP 节点和 BP 节点无先后之分。
//搭建DMDPC过程中加入MP、SP和BP,必须登录MP进行操作
dm8dpc>$disql SYSDBA/SYSDBA2023@84.0.191.30:5239
-
-
- 增加MP节点
-
//注册当前MP实例,MP的RAFT组名可以指定为NULL或者'MP_RAFT'
SQL>SP_CREATE_DPC_INSTANCE(NULL,'CUGDBMP1','MP',6003,5239, '84.0.191.30', '84.0.191.30','NORMAL',1,'MP instance');
//注册RAFT组,名为RAFT_1
SQL>SP_CREATE_DPC_RAFT('BP','RAFT_1');
//在RAFT_1组内注册BP实例BP1
SQL>SP_CREATE_DPC_INSTANCE('RAFT_1','CUGDBBP1','BP',6001,5237, '84.0.191.30', '84.0.191.30','NORMAL',1,'BP instance');
SQL>SP_CREATE_DPC_RAFT('BP', 'RAFT_2');
//在RAFT_2内注册BP实例BP2
SQL>SP_CREATE_DPC_INSTANCE('RAFT_2','CUGDBBP2','BP',6002,5238, '84.0.191.30', '84.0.191.30', 'NORMAL', 1, 'BP instance');
SQL>SP_CREATE_DPC_BP_GROUP('BG_1', 'bp group1');
//往BP组中添加RAFT组
SQL>SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_1');
SQL>SP_BP_GROUP_ADD_RAFT('BG_1', 'RAFT_2');
//增加SP,也要注册RAFT组
SQL>SP_CREATE_DPC_RAFT('SP', 'RAFT_SP1');
//在RAFT_SP1内注册SP实例SP1
SQL>SP_CREATE_DPC_INSTANCE('RAFT_SP1','CUGDBSP1','SP',6000,5236, '84.0.191.30', '84.0.191.30','NORMAL', 2, 'SP instance');
SQL>SP_CREATE_FAULT_DOMAIN ('FDOM_1','shanghai');
SQL>SP_FAULT_DOMAIN_MV_INST('FDOM_1','CUGDBMP1');
SQL>SP_FAULT_DOMAIN_MV_INST('FDOM_1','CUGDBBP1');
SQL>SP_FAULT_DOMAIN_MV_INST('FDOM_1','CUGDBBP2');
注意
将SP和BP节点加入DMDPC集群中的步骤必须在SP、BP第一次启动前完成!
查询系统表,检查上一步骤的注册是否成功。能查到相关信息表示注册成功。
select * from DPC_BP_GROUP;
//查询结果如下:
select * from DPC_BP_RAFT;
//查询结果如下:
行号 RAFT_ID GROUP_ID DPC_MODE NAME IS_VALID INFO1 INFO2 INFO3
---------- ----------- ----------- -------- -------- ----------- -----------
1 0 -1 MP MP_RAFT 1 NULL NULL NULL
2 1 -1 BP RAFT_1 1 NULL NULL NULL
3 2 -1 BP RAFT_2 1 NULL NULL NULL
4 3 -1 SP RAFT_SP1 1 NULL NULL NULL
select * from DPC_INSTANCE;
//查询结果如下:
行号 RAFT_ID INST_ID NAME DPC_MODE XMAL_PORT INST_PORT IP_INTERNAL SYS_MODE SYS_STATUS STATUS DESCRIPTION IP_EXTERNAL INFO1 INFO2 INFO3
---------- ----------- ----------- ---- -------- ----------- ----------- ------------ -------- ----------- ------
1 0 4096 CUGDBMP1 MP 6003 5239 84.0.191.30 NORMAL 4 1 MP instance 84.0.191.30 65536 NULL NULL
2 1 4097 CUGDBBP1 BP 6001 5237 84.0.191.30 NORMAL 6 1 BP instance 84.0.191.30 65536 NULL NULL
3 2 4098 CUGDBBP2 BP 6002 5238 84.0.191.30 NORMAL 6 1 BP instance 84.0.191.30 65536 NULL NULL
4 3 4099 CUGDBSP1 SP 6000 5236 84.0.191.30 NORMAL 6 2 SP instance 84.0.191.30 NULL NULL NULL
-
-
- 启动 SP 和 BP
-
启动 SP 和 BP 没有先后之分。
#Linux
dmserver /dm8/data/sp1/CUGDB/dm.ini dpc_mode=SP
后台启动
dm8dpc>$vi /dm8/script/dmspstart.sh
dmserver /dm8/data/sp1/CUGDB/dm.ini dpc_mode=SP
dm8dpc>$chmod +x dmspstart.sh
dm8dpc>$./dmmpstart.sh &
#Windows
dmserver d:\dpc_data\sp1\CUGDB\dm.ini dpc_mode=SP
#Linux
dmserver /dm8/data/bp1/CUGDB/dm.ini dpc_mode=BP
dmserver /dm8/data/bp2/CUGDB/dm.ini dpc_mode=BP
后台启动
dm8dpc>$vi /dm8/script/dmbp1start.sh
dmserver /dm8/data/bp1/CUGDB/dm.ini dpc_mode=BP
dm8dpc>$vi /dm8/script/dmbp2start.sh
dmserver /dm8/data/bp2/CUGDB/dm.ini dpc_mode=BP
dm8dpc>$chmod +x dmbp1start.sh
dm8dpc>$chmod +x dmbp2start.sh
dm8dpc>$./dmbp1start.sh &
dm8dpc>$./dmbp2start.sh &
#Windows
dmserver d:\dpc_data\bp1\CUGDB\dm.ini dpc_mode=BP
dmserver d:\dpc_data\bp2\CUGDB\dm.ini dpc_mode=BP
至此,DMDPC 集群搭建完毕。
MP、SP、BP 全部正常启动,且均处于 OPEN 状态,才是一个正常的 DMDPC 系统!
将 SP 和 BP 节点加入 DMDPC 集群中的步骤必须在 SP、BP 第一次启动前完成!
注意
当BP处于下述情况时,表示无可用BP,系统异常,报错“无效的系统状态”。无可用BP的情况为:
1.BP处于非OPEN状态;
2.BP尚未成功启动;
3.BP宕机。
Ps -ef | grep dm
连接SP
DMDPC 搭建完成后,用户只需要连接对外提供服务的 SP,即可获得完整的数据库服务。
验证环境搭建是否成功,可以在 SP 上执行查询 V$instance,看是否所有 RAFT 组中实例都能够查到。
只有出于监控目的进行 V$视图的查询,或出于维护需要时,才允许直连 MP 和 BP,否则搭建完成后,不允许再连接 MP 和 BP。切勿在 MP 和 BP 上执行大量 SQL 语句,否则可能会导致系统崩溃!
dm8dpc>$disql SYSDBA/SYSDBA2023@84.0.191.30:5236
SQL> select name from v$database;
行号 NAME
---------- ------
1 CUGDB
2 CUGDB
3 CUGDB
SQL> select name from v$instance;
行号 NAME
---------- ----
1 CUGDBBP1
2 CUGDBSP1
3 CUGDBMP1
4 CUGDBBP2
SQL> select path from v$datafile;
行号 PATH
---------- ------------------------------
1 /dm8/data/sp1/CUGDB/TEMP.DBF
2 /dm8/data/bp2/CUGDB/ROLL.DBF
3 /dm8/data/bp2/CUGDB/TEMP.DBF
4 /dm8/data/bp2/CUGDB/SYSTEM.DBF
5 /dm8/data/mp1/CUGDB/MAIN.DBF
6 /dm8/data/mp1/CUGDB/ROLL.DBF
7 /dm8/data/mp1/CUGDB/TEMP.DBF
8 /dm8/data/mp1/CUGDB/SYSTEM.DBF
9 /dm8/data/bp1/CUGDB/ROLL.DBF
10 /dm8/data/bp1/CUGDB/TEMP.DBF
11 /dm8/data/bp1/CUGDB/SYSTEM.DBF
SQL> select arch_mode from v$database;
行号 ARCH_MODE
---------- ---------
1 N
2 N
3 N
SQL> select * from V$instance;
使用 exit 命令退出 DMDPC 需要按照正确的顺序有序进行。
第一步 退出 SP;
第二步 退出 BP;
第三步 退出 MP。
注意
如果没有按正常顺序退出,可能会导致剩下的机器直接宕机。此时,只能对其他的机器采用强杀。这种服务器异常退出的情况,当再次重启的时候,服务器需要做大量的REDO日志,因此重启的时间会稍长一些,其它没有影响。
dm8dpc>$disql SYSDBA/SYSDBA2023@84.0.191.30:5236
dm8dpc>$mkdir -p /dm8/data/CUGDB
-- 创建表空间
SQL>create tablespace "OMP_TS" datafile '/dm8/data/CUGDB/OMPTS01.DBF' size 1024 autoextend on;
-- 创建用户及授权
SQL>CREATE USER omp IDENTIFIED BY "omp123123!" DEFAULT TABLESPACE OMP_TS;
-- 密码时效不做限制
SQL>alter user "omp" limit password_lock_time unlimited;
-- 授权
SQL>GRANT RESOURCE TO omp;
-- omp用户登录
SQL> conn omp/"omp123123!"
create table year_2001(
ID number(10) primary key not null,
name varchar2(30),
port VARCHAR(255),
speed VARCHAR(255),
type VARCHAR(255),
create_time date
);
begin
for i in 1..20 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
begin
for i in 21..40 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-21 23:51:49','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
begin
for i in 41..50 loop
insert into year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-22 08:31:49','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
SQL> select TABLE_NAME from user_tables;
LINEID TABLE_NAME
---------- ----------
year_2001
SQL> select count(*) from year_2001;
LINEID COUNT(*)
---------- --------------------
50
dm8db01>$disql omp/'omp123123!'@127.0.0.1:5236
--建索引
SQL> create index year2001_index on year_2001(id);
--建主键
alter table year_2001 add constraint year_2001_PK primary key (id);
--增加(insert)
insert into year_2001 values(51, 'cisco-51','3306','10000','router-51',to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));
--删除(delete,truncate)
SQL> delete from year_2001 where id >=48 and id <=50;
--修改(update)
SQL> update year_2001 set name='cisco-555' where id=51;
--查询(select)
SQL> select count(*) from omp.year_2001;