DM数据库学习之路(十)DM8DPC集群单机1SP1MP2BP(无副本)部署

  1. 简介

DMDPC是基于达梦数据库管理系统研发的一款同时支持在线分析处理和在线事务处理的新型分布式数据库系统。它既具备传统单机数据库的绝大部分功能,又提供了分布式计算集群才拥有的高可用、高扩展、高性能、高吞吐量和对用户透明等高级特性。DMDPC 架构旨在提供具有分布式特性的可扩展、高性能数据库解决方案,以满足具有高并发、大规模数据存储、业务快速扩张等特征的用户业务对数据库的要求。

  1. 架构

一个完整的 DMDPC 架构由计划生成节点 SP、数据存储节点BP和元数据服务器节点MP 三部分组成。

SP 对外提供分布式数据库服务,用户可以登录到任意一个 SP 节点,获得完整的数据库服务,SP节点不存储数据,配置成单机即可。

BP负责存储数据,执行SP的调度指令并将执行结果返回给 SP;

MP负责存储元数据并向SP、BP提供元数据服务。

MP和BP节点既可以配置成单机,也可以配置成多副本系统。其中每一个多副本系统中只有一个作为主节点,其余节点均作为备份节点。

左侧为单机DMDPC,右侧为配有多副本系统的DMDPC。

  1. 名词解释
    1. 计划生成节点(SP)

计划生成节点,英文全称为 SQL Processor,简称为 SP。

SP 为 DMDPC 集群中对外提供数据库服务的节点,负责接收用户请求并生成计划、划分子计划、按照一定规则计算并行度并调度各个子计划,并最终将执行结果返回给用户。对于一次客户端请求任务来说,客户端连接的SP负责生成、划分并调度计划,其它的SP和BP负责执行计划。

SP的实现是在已有的成熟达梦单机数据库处理框架的基础上新增了分布式计算处理。因此 SP 具备以下特征:

  1. 全部的SQL标准支持:包括复杂关联查询、存储过程、视图、序列等某些分布式数据库难以支持的特性。
  2. SP节点自身无状态:每个SP节点上不存储任何数据字典信息和用户数据,一个集群中可以存在多个 SP 节点。连接上任何一个 SP 节点都可以获得完整的数据库服务。
  3. SP具备子计划的执行能力:因为SP和BP是由同一套代码编译出来的,只是不同的启动参数决定了担任不同的角色,所以SP和BP一样具有操作符的执行能力。例如:从资源均衡利用和计算存储分离角度来考虑,DMDPC 将部分子计划安排在SP上执行。
  4. 支持动态增删节点。
    1. 数据存储节点(BP)

数据存储节点,英文全称为 Backend Processor,简称为 BP。

BP为DMDPC集群中数据实际存储的节点,负责存储数据和接收SP的子任务调度指令,执行子任务,并返回结果给 SP。

一个 DMDPC 集群可配置多个BP节点同时提供服务,且可以随着用户业务量变化动态增删BP节点。为了保障BP节点能够持续提供服务,每一个BP节点又可以配置成一个BP多副本系统。

    1. 元数据服务器节点(MP)

元数据服务器节点,英文全称为 Metadata Processor,简称为MP。

MP为DMDPC集群中提供元数据服务(即字典信息服务)的节点。所有DDL请求都会经过SP转发给MP执行,元数据信息全部存储在MP。一个DMDPC集群只能配置一个MP节点提供服务。为了保障 MP节点能持续提供服务,MP节点可以配置成一个 MP多副本系统。

    1. 多副本系统

在现实环境中,DMDPC运行过程中有可能会碰到各种故障情况,比如系统掉电、硬件故障(如磁盘损坏)、自然灾害(地震、火灾)等意外情况,因此需要对BP或MP采用多副本系统架构进行存储,以保障DMDPC的数据安全和高可用性,避免出现数据损坏和丢失,并且可以快速恢复数据库服务,满足用户不间断提供数据库服务的要求。

DM多副本系统由N个节点实例组成,N必须是大于1的奇数。只有配置了RAFT归档的实例才能加入多副本系统。

目前一个多副本系统最多支持部署9个节点实例。同一个RAFT 组中的所有节点(三个或三个以上)共同构成一个多副本系统。实例之间通过XMAL模块进行TCP 消息通讯。各个节点实例之间基于RAFT协议选举出一个领导者作为主库,其他实例作为备库(也就是副本)角色运行。主库会自动向备库同步日志,备库接收并重新应用日志,从而达到主备库之间数据保持一致的目的。

    1. BP多副本架构

上图展示了三个BP域的集群架构,每个BP域中都包含多个BP。同一个RAFT组的多个BP保存了同样数据的多个副本。例如:BP1、BP1’和 BP1”三者内容完全相同。同一个 RAFT 组中的所有BP节点共同构成一个BP多副本系统。同一个 RAFT 组中的多个副本中只有一个作为主节点对外提供服务,其余节点均作为备份节点。当主节点发生故障后,系统会从备份节点中(BP1’,BP1”)重新选举出新的主节点对外提供服务。

在 BP 多副本系统中,可通过 V$ARCH_STATUS 和 V$RLOG_RAFT_INFO 来查看整个系统中主备环境的运行状况。

    1. MP多副本架构

上图展示了三个MP域的集群架构,每个MP域中最多只包含1个MP。同一个RAFT组的多个MP保存了同样数据的多个副本。例如:MP1、MP1’和 MP1”三者内容完全相同。同一个 RAFT 中的三个MP节点共同构成一个MP多副本系统。同一个RAFT组中的多个副本中只有一个作为主节点对外提供服务,其余节点均作为备份节点。当主节点发生故障后,系统会从备份节点中(MP1’, MP1”)重新选举出新的主节点对外提供服务。

在MP多副本系统中,可通过 V$ARCH_STATUS 和 V$RLOG_RAFT_INFO 来查看整个系统中主备环境的运行状况。

  1. DM8DPC单机架构部署(BP无副本)
    1. DMDPC单机架构说明

一个最小的DMDPC集群包含一个BP、一个SP 和一个MP。可以在部署完毕后随时增添新的BP、SP节点。至少需要两台BP才方便看出子任务的各种计划形态和调度。

Windows和Linux 环境下部署 DMDPC 集群并无区别,目前支持借助命令行工具部署和DEM图形化界面方式部署两种方式。

    1. 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

    1. 命令行部署DM8DPC
      1. DM8 SOFT安装

只安装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

      1. 建数据库实例目录

#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

      1. 初始化数据库实例

初始化 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

      1. 为 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 命令行工具执行:

        1. 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

        1. 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

        1. 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

        1. 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

      1. 启动 MP

#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 需要始终处于开启状态。

      1.  将 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

      1. 增加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');

        1. 增加两个BP节点:BP1和BP2

//注册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');

        1. 注册RAFT_2

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');

        1. 注册一个BP组,名为BG_1

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');

        1. 增加SP节点:SP1

//增加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');

        1. 注册一个容错域:FDOM_1 (可选)

SQL>SP_CREATE_FAULT_DOMAIN ('FDOM_1','shanghai');

        1. 往容错域中添加实例

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第一次启动前完成!

      1.  检查注册是否成功

查询系统表,检查上一步骤的注册是否成功。能查到相关信息表示注册成功。

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

      1. 启动 SP 和 BP

启动 SP 和 BP 没有先后之分。

        1. 启动 SP

#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

        1. 启动 BP

#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宕机。

      1. DMDCP验证
        1. 查看所有进程

Ps -ef | grep dm

连接SP

        1. 连接 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;

      1. 退出 DMDPC

使用 exit 命令退出 DMDPC 需要按照正确的顺序有序进行。

第一步 退出 SP;

第二步 退出 BP;

第三步 退出 MP。

注意

如果没有按正常顺序退出,可能会导致剩下的机器直接宕机。此时,只能对其他的机器采用强杀。这种服务器异常退出的情况,当再次重启的时候,服务器需要做大量的REDO日志,因此重启的时间会稍长一些,其它没有影响。

  1. DMDPC单机架构(BP无副本)测试
    1. 建表空间及用户

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!"

    1. 建测试数据

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

    1. 增删改查测试

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;

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值