SQL基本操作
表空间操作
表空间是数据库的逻辑存储结构,所有数据库对象均存储于指定的表空间内。
创建表空间
执行CREATE TABLESPACE语句创建表空间。
SYSTEM/SYSAUX/UNDO/SWAP/TEMPORARY/DEFAULT表空间在CREATE DATABASE时创建,不能用CREATE TABLESPACE语句创建。
SQL> CREATE TABLESPACE ts_yashan;
SQL> CREATE TABLESPACE remotebak DATAFILE '/yashandb/data/db-1-1/dbfiles/remotebak01.dbf' SIZE 4M AUTOEXTEND ON NEXT 4M MAXSIZE 1G PARALLEL 2;
总结:Oracle创建表空间时暂不支持省略datafile后面的内容,也没有并行参数。表空间中普通数据文件最大文件大小32G,而YashanDB中可不指定DATAFILE,不指定DATAFILE时默认会创建一个数据文件。
创建临时表空间
create tablespace remotebaktemp;
或
create tablespace remotebaktemp tempfile '/yashandb/data/db-1-1/dbfiles/remotebaktemp01.dbf'
查看表空间
通过查询DBA_TABLESPACES视图查看当前数据库中存在的所有表空间:
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
--查表空间和数据文件关系
SQL> select tablespace_name,file_name from dba_data_files;
修改表空间
执行ALTER TABLESPACE语句修改表空间的相关属性:
- 执行如下语句为ts_yashan表空间增加一个数据文件:
SQL> ALTER TABLESPACE ts_yashan ADD DATAFILE;
- 执行如下语句收缩ts_yashan表空间大小
SQL> ALTER TABLESPACE ts_yashan SHRINK SPACE;
删除表空间
执行DROP TABLESPACE语句删除表空间:
SQL> DROP TABLESPACE ts_yashan; --不删除操作系统上数据文件
SQL> drop tablespace remotebak including contents and datafiles; --同时删除操作系统上数据文件
问题处理
1.创建表空间失败
问题描述
创建表空间语句含区管理段空间管理,oracle中创建成功,yashan中报错。
--oracle中成功
create tablespace remotebak datafile '/oradata/topdh/remotebak01.dbf' size 200m autoextend on next 50m maxsize unlimited logging extent management local segment space management auto;
--yashan db中报错
SQL> create tablespace remotebak datafile '/yashandb/data/db-1-1/dbfiles/remotebak01.dbf' size 200m autoextend on next 50m maxsize unlimited logging extent management local segment space management auto;
[1:137]YAS-00207 end of text expected but l found
问题分析
语法和oracle不一样
extent_management_clause
该语句用于指定表空间里的对象申请extent时的空间分配方式:
- AUTOALLOCATE:根据对象当前大小由系统自动分配extent空间。
- UNIFORM SIZE size_clause:每次为对象分配的extent空间为固定的值。
- 创建表空间后不能修改extent分配方式。
- 创建undo和swap表空间不允许指定extent分配方式,只能使用UNIFORM分配方式。
- 创建非undo和swap表空间时若不指定extent分配方式,使用AUTOALLOCATE分配方式。
- 使用UNIFORM分配方式的表空间内的每个数据文件大小都必须大于UNIFORM SIZE。
解决办法
create tablespace remotebak datafile '/yashandb/data/db-1-1/dbfiles/remotebak01.dbf' size 200m autoextend on next 50m maxsize unlimited EXTENT UNIFORM SIZE 64K ;
2.创建临时表空间失败
问题描述
创建临时表空间失败,oracle中创建成功,yashan中报错。
--oracle中成功
create temporary tablespace remotebaktemp tempfile '/oradata/topicis/remotebaktemp01.dbf'
--yashan db中报错
SQL> create temporary tablespace remotebaktemp tempfile '/yashandb/data/db-1-1/dbfiles/remotebaktemp01.dbf';
YAS-00004 feature "creating temporary tablespace" has not been implemented yet
问题分析
语法和oracle不一样,需要去掉temporary 参数
解决办法
去掉temporary 参数,创建成功。
create tablespace remotebaktemp tempfile '/yashandb/data/db-1-1/dbfiles/remotebaktemp01.dbf';
表操作
表是数据库用来存放数据的一个集合,一般与实体对象一一对应,如人员表、部门表、公司表等,一般由行和列这两个二维信息来组织表数据。
创建表
执行CREATE TABLE语句创建表:
- 执行如下语句创建表:
SQL> CREATE TABLE tb_yashan(c1 INT,C2 VARCHAR(10));
查看表
通过查询USER_TABLES视图查看当前用户中已存在的表名称:
SQL> SELECT TABLE_NAME,TABLE_TYPE FROM USER_TABLES limit 1;
TABLE_NAME TABLE_TYPE
---------------------------------------------------------------- ----------
TB_YASHAN HEAP HEAP
执行SELECT语句查看表中具体信息:
SQL> SELECT * FROM tb_yashan;
C1 C2
------------ -------------
0 rows fetched.
查看表结构:
SQL> desc tb_yashan
NAME NULL? DATATYPE
---------------------------------------------------------------- --------- ---------------------------------
C1 INTEGER
C2 VARCHAR(10)
修改表
执行ALTER TABLE语句修改表的相关属性:
- 执行如下语句修改表名称:
SQL> ALTER TABLE tb_yashan RENAME TO tab_yashan;
Succeed.
- 执行如下语句在表中新增列字段:
SQL> ALTER TABLE tab_yashan ADD(c3 NUMBER);
Succeed.
- 执行如下语句修改表中列字段的数据类型:
ALTER TABLE tab_yashan MODIFY c3 FLOAT;
删除表
执行DROP TABLE语句删除表:
SQL> DROP TABLE tab_yashan;
Succeed.
索引操作
索引是一种物理的对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或若干列值的集合,是指向表中物理标识这些值所在行的逻辑指针清单。
创建索引
执行CREATE INDEX语句创建索引:
SQL> CREATE TABLE tb_index(c1 INT,c2 INT);
SQL> CREATE INDEX inde1 ON tb_index(c1);
查看索引
通过查询USER_INDEXES视图查看当前用户的索引信息:
SQL> SELECT * FROM USER_INDEXES;
INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE UNIQUENESS COMPRESSION PREFIX_LENGTH TABLESPACE_NAME INI_TRANS MAX_TRANS PCT_FREE LOGGING BLEVEL LEAF_BLOCKS DISTINCT_KEYS AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY STATUS NUM_ROWS SAMPLE_SIZE LAST_ANALYZED PARTITIONED TEMPORARY GENERATED VISIBILITY DATABASE_MAINTAINED CONSTRAINT_INDEX
------------- -------------- --------------- --------------- ---------------- ---------- ----------- ------------- ------------------- ------------ ------------ ------------ ------- ------------ --------------------- --------------------- ----------------------- ----------------------- --------- --------------------- --------------------- --------------------- ----------- --------- --------- ------------- ------------------- ----------------
INDE1 NORMAL YASHAN TB_INDEX TABLE N DISABLED 0 USERS 2 255 8 Y VALID N N N VISIBLE N N
SQL> SELECT INDEX_NAME FROM USER_INDEXES;
INDEX_NAME
-------------
INDE1
删除索引
执行DROP INDEX语句删除索引:
SQL> DROP INDEX inde1;
数据操作
插入数据
通过执行INSERT语句往表中插入数据:
SQL> CREATE TABLE insert_tb(c1 INT,c2 CHAR(10));
SQL> INSERT INTO insert_tb VALUES(4,'hello');
SQL> INSERT INTO insert_tb VALUES(1,'world'),(2,'nihao'),(3,'shijie');
SQL> COMMIT;
删除数据
YashanDB中可选DELETE和TRUNCATE TABLE两种方式对表数据进行删除:
- 通过执行DELETE语句删除数据:
- 执行如下语句删除insert_tb表中c1=1的行:
SQL> DELETE FROM insert_tb WHERE c1=1;
- 执行如下语句删除insert_tb表中所有行:
SQL> DELETE insert_tb;
- 通过执行TRUNCATE TABLE语句一次性删除表中所有数据:
- 执行如下语句删除insert_tb表中所有数据:
SQL> TRUNCATE TABLE insert_tb;
插入和更新数据
通过执行UPDATE语句更新表中数据:
- 执行如下语句将insert_tb表c1列字段中c1=1的数据更新为c1=5:
INSERT INTO insert_tb VALUES(1,'nihao'),(2,'hello'),(3,'shijie'),(4,'world');
SELECT * FROM insert_tb;
C1 C2
------------ -------------
1 nihao
2 hello
3 shijie
4 world
UPDATE insert_tb SET c1=5 WHERE c1=1;
SELECT * FROM insert_tb;
C1 C2
------------ -------------
5 nihao
2 hello
3 shijie
4 world
- 执行如下语句批量更新insert_tb表中的数据:
update insert_tb set (c1,c2)=(7,'newvalue') where c1=3;
SELECT * FROM insert_tb;
C1 C2
------------ -------------
5 nihao
2 hello
7 newvalue
4 world
查询数据
通过执行SELECT语句查询表数据:
- 执行如下语句查询insert_tb表中所有数据:
SELECT * FROM insert_tb;
C1 C2
------------ -------------
5 nihao
2 hello
7 newvalue
4 world
- 执行如下语句按照insert_tb表中c1列字段的大小顺序进行排序查询:
SELECT * FROM insert_tb ORDER BY c1;
C1 C2
------------ -------------
2 hello
4 world
5 nihao
7 newvalue
- 执行如下语句对insert_tb表进行条件查询:
SELECT C2 FROM insert_tb WHERE c1=5;
C2
-------------
nihao
事务操作
提交事务前,用户在事务过程做的任何修改只有自己能看到,其他用户无法看到,并可以通过回滚操作将数据恢复。
提交事务后,其他用户可看到修改后的数据,此时无法通过回滚操作将数据恢复。
提交事务
执行COMMIT语句提交事务:
CREATE TABLE COM_TB(c1 INT);
INSERT INTO COM_TB VALUES(1),(2),(3);
COMMIT;
注:Oracle是没有这样的写法的,一定程度上加快了导入效率,插入大数据量的场景下还是很有时间上的优势。
回退事务
执行ROLLBACK语句回退事务:
- 执行如下语句于COM_TB表中添加新数据:
- 执行ROLLBACK语句将事务回退至修改前状态:
INSERT INTO COM_TB VALUES(6);
SELECT * FROM COM_TB;
C1
------------
1
2
3
6
ROLLBACK;
SELECT * FROM COM_TB;
C1
------------
1
2
3
用户操作
创建用户
执行如下SQL命令创建新用户yashan,并为其指定密码yashan:
CREATE USER yashan IDENTIFIED BY yashan;
创建角色
执行如下SQL命令创建新角色yashan_role:
CREATE ROLE yashan_role;
授权用户
执行如下SQL命令为用户yashan授予登录会话和创建资源的权限:
GRANT CONNECT TO yashan;
GRANT RESOURCE TO yashan;
切换用户
执行如下SQL命令切换至用户yashan:
conn yashan/yashan;
Connected to:
YashanDB Server Personal Edition Release 23.1.0.100 x86_64 - X86 64bit Linux
Note:
切换对象须具有登录会话的权限方可进行切换操作。
修改密码
执行如下SQL命令将yashan用户的密码修改为yashandb:
ALTER USER yashan IDENTIFIED BY "yashandb";
导入导出工具
csv数据快速导入
yasldr是YashanDB提供的客户端导入工具,用于执行CSV格式的数据文件导入,每次导入单个数据文件至单个表中,有关yasldr工具的具体使用语法及限制可参考yasldr使用指导章节。
导入前准备
- 准备导入数据文件:
- 于操作系统终端中执行如下命令在HOME目录下创建datafile文件:
su - yashan cd /home/yashan vi datafile
- 将如下内容写入datafile文件中:
1|load|101
2|load|201
- 通过Esc键退出输入模式,然后输入:wq保存并关闭文件。
- 准备导入用户:
- 执行如下命令连接YashanDB数据库,请将password更改成设置的sys用户密码:
[yashan@localhost ~]$ yasql 'sys/"Admin@2023"'
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
- 执行如下SQL命令创建用户yasldr_user,并为其指定密码yasldr:
CREATE USER yasldr_user IDENTIFIED BY yasldr;
- 执行如下SQL命令为yasldr_user用户授予登录会话和创建资源的权限:
GRANT CONNECT TO yasldr_user;
GRANT RESOURCE TO yasldr_user;
- 执行如下SQL命令切换至yasldr_user用户:
conn yasldr_user/yasldr
Connected to:
YashanDB Server Personal Edition Release 23.1.0.100 x86_64 - X86 64bit Linux
- 准备数据文件导入的目标表:
- 执行如下SQL命令创建表loadData:
CREATE TABLE loadData (c1 INT,c2 CHAR(10),c3 INT);
- 执行如下命令退出YashanDB数据库:
SQL> exit
数据导入
- 于操作系统终端中执行如下命令将datafile文件中数据导入至yasldr_user用户的loadData表中:
$ yasldr yasldr_user/yasldr batch_size=4032 control_text="'LOAD DATA OPTIONS(DEGREE_OF_PARALLELISM=2) INFILE '/home/yashan/datafile' FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '\"' APPEND INTO TABLE loadData(c1,c2,c3) '"
YashanDB Loader Release 23.1.0.100 x86_64 297f388
[YASLDR] execute succeeded
验证数据
- 执行如下命令登录数据库:
$ yasql yasldr_user/yasldr YashanDB SQL Personal Edition Release 23.1.0.100 x86_64 Connected to: YashanDB Server Personal Edition Release 23.1.0.100 x86_64 - X86 64bit Linux SQL>
- 执行如下SQL命令查看表loadData中数据:
如上命令将datafile文件中数据根据|进行分隔,分别导入loadData表中的c1、c2和c3列字段中。
SELECT * FROM loadData;
C1 C2 C3
------------ ------------- ------------
1 load 101
2 load 201
元数据和数据导入导出
exp工具是YashanDB的配套导出工具,提供元数据导出及CSV导出能力;
imp为YashanDB的配套导入工具,提供元数据导入能力。
用户可通过使用exp工具将YashanDB数据库中的表结构、索引、约束等所有数据生成一个元数据文件,该元数据文件可通过配套的导入工具imp导入至同构的YashanDB数据库中。或者通过exp工具将指定表结构排列的数据导出至CSV文件中,并通过yasldr工具将该CSV文件导入至YashanDB数据库中。
导入前准备
- 准备导入用户:
- 执行如下命令连接YashanDB数据库:
[yashan@localhost ~]$ yasql 'sys/"Admin@2023"'
YashanDB SQL Personal Edition Release 23.1.1.100 x86_64
Connected to:
YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
- 执行如下SQL命令创建用户import_user,并为其指定密码import:
CREATE USER import_user IDENTIFIED BY import;
- 执行如下SQL命令将DBA权限授权给import_user用户:
GRANT DBA TO import_user;
- 执行如下SQL命令切换至import_user用户:
conn import_user/import
Connected to:
YashanDB Server Personal Edition Release 23.1.0.100 x86_64 - X86 64bit Linux
- 执行如下SQL命令于import_user用户中创建表并插入数据:
CREATE TABLE test(c1 INT,c2 CHAR(10));
INSERT INTO test VALUES(1,'h'),(2,'a'),(3,'c');
CREATE TABLE test1(c1 INT,c2 INT);
INSERT INTO test1 VALUES(1,2),(3,4),(5,6);
COMMIT;
导出数据
- 执行如下SQL命令退出YashanDB数据库:
SQL> exit
- 于操作系统终端中执行如下命令将import_user用户下所有元数据导出至export.owner.export文件中,请将password更改成设置的sys用户密码:
$ exp 'sys/"Admin@2023"' FILE=export.owner.export OWNER=import_user
YashanDB Export Release 23.1.1.100 x86_64 297f388
export terminated successfully
- 执行如下命令查看导出的元数据文件:
cd /home/yashan ... -rw-r----- 1 yashan yashan 16771 Aug 14 21:08 export.owner.export ...
导入数据
- 执行如下命令连接YashanDB数据库:
$ yasql import_user/import YashanDB SQL Personal Edition Release 23.1.1.100 x86_64 Connected to: YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux
- 执行如下SQL命令删除表test和test1:
DROP TABLE test;
DROP TABLE test1;
COMMIT;
- 通过查询USRE_TABLES视图查看当前用户下所有表信息,此时import_user用户下不存在任何表:
SELECT table_name FROM USER_TABLES;
TABLE_NAME
----------------------------------------------------------------
- 执行如下命令退出YashanDB数据库:
SQL> exit
- 于数据库终端中执行如下命令将元数据文件导入至import_user用户。
$ imp sys/password FILE=export.owner.export FROMUSER=import_user
YashanDB Import Release 23.1.1.100 x86_64 297f388
import terminated successfully
验证数据
- 登录数据库并查看用户表信息:
$ yasql import_user/import YashanDB SQL Personal Edition Release 23.1.1.100 x86_64 Connected to: YashanDB Server Personal Edition Release 23.1.1.100 x86_64 - X86 64bit Linux SQL> SELECT table_name FROM USER_TABLES; TABLE_NAME ---------------------------------------------------------------- TEST1 TEST
- 执行如下SQL命令查看表test和test1中的数据:
SQL> SELECT * FROM test;
C1 C2
------------ -------------
1 h
2 a
3 c
SQL> SELECT * FROM test1;
C1 C2
------------ ------------
1 2
3 4
5 6
使用感悟
语法和Oracle相似度很高,大多场景可以直接套用Oracle语法,减少了学习投入时间,在Oracle向YashanDB迁移时更平滑,减少了迁移难度。在兼容Oracle方面做的很尽心,添加了不少Oracle不具备的特性,但是还是需要注意部分使用语法的差异,官网ORACLE兼容性说明板块的内容倾向于开发方向,运维方面的差异还是需要多实践总结,比如临时表空间的创建,创建表空间时可增加并行、桶等参数。