IT评测·应用市场-qidao123.com

标题: 国产数据库OceanBase从入门到放弃教程 [打印本页]

作者: 北冰洋以北    时间: 2025-1-2 15:02
标题: 国产数据库OceanBase从入门到放弃教程
1. 先容

是由蚂蚁集团(Ant Group,原蚂蚁金服)自主研发的分布式关系型数据库。它旨在办理海量数据存储和高并发访问的问题,特别恰当金融级应用场景,如付出宝等对数据同等性、可靠性和性能有极高要求的服务。以下是关于 OceanBase 数据库的一些关键特点和上风:
1.1 核心特性

1. 分布式架构


2. 高性能


3. 高可用性


4. 兼容 MySQL/Oracle


5. 低成本


1.2 应用场景

OceanBase 广泛应用于付出整理、电子钱包、转账汇款、信贷风控等范畴,尤其是在必要处理大量生意业务且对响应速度和数据安全有严格要求的地方体现优秀。此外,随着云服务的发展,OceanBase 也开始向云端延伸,为更多中小企业提供灵活可靠的数据库办理方案。
1.3 社区与生态

OceanBase 不但是一个商业产品,也有活跃的开源社区版(OceanBase Community Edition),鼓励开发者和技术爱好者到场到项目的开发和完善中来。同时,围绕 OceanBase 形成了丰富的工具链和服务体系,包括但不限于监控报警、备份恢复、性能调优等工具,以及专业的技术支持团队。
2. 安装

安装要求:必要6G内存,14G磁盘空间。
2.1 镜像下载

下载oceanbase-ce镜像,这里只体验社区兼容MySQL版本的,兼容Oracle版本是企业版,商用,一样平常接触不到。如果企业要用,也是由厂商技术支持直接安装,一样平常接触不到这个镜像源。
  1. # 下载oceanbase-ce镜像
  2. docker pull oceanbase/oceanbase-ce
复制代码
2.2 启动容器

  1. docker run -p 2881:2881 \
  2.         --name oceanbase \
  3.         --restart=always \
  4.         -e MODE=MINI \
  5.         -e OB_TENANT_PASSWORD=123456 \
  6.         -d oceanbase/oceanbase-ce
复制代码
2.3 安装监测

启动后可及时观察日记是否乐成安装
  1. docker logs -f oceanbase
复制代码
2.4 连接数据库

oceanbase-ce 镜像安装了OceanBase数据库客户端obclient,所以可以使用obclient客户端或其他方式。
  1. # 1. 进入容器
  2. docker exec -it oceanbase bash
  3. # 无密码方式
  4. obclient -uroot@sys -h127.0.0.1 -P2881
  5. # 有密码方式
  6. obclient -uroot@sys -h127.1 -P2881 -p123456
复制代码

3. SQL语句

SQL的英文是Structured Query Language,简称SQL,是一种操纵关系型数据库的布局化查询语言。操纵数据库,最常常使用就是查询操纵。
1、OceanBase数据库也兼容Oracle语法,这个社区版不支持;
2、OceanBase数据库的SQL语句不区分巨细写,关键字建议使用大写;
3、SQL语句可以使用单行或多行书写,以分号结尾
4、注释
单行注释
  1. - 单行注释
  2. # 单行注释
复制代码
多行注释
  1. /*
  2. 多行注释
  3. 多行注释
  4. */
复制代码
4. SQL分类

分类说明作用备注DDL数据界说语言用来对数据库、表、列的界说data definition languageDML数据操纵语言用来对数据库中表的数据进行增、删、改操纵data manipulation languageDQL数据查询语言用来对数据库中表的数据进行查询data query languageDCL数据控制语言用来对数据库的控制(用户创建、权限控制)data control language 5. DDL

5.1 库的DDL

一个功能,一样平常都是四个动作,增编削查。
展示全部的数据库
  1. show databases;
复制代码
创建数据库
  1. create database 数据库名称 charset=utf8;
  2. create database if not exists 数据库名称 charset=utf8; # 使得SQL语句更加强健、健壮。
复制代码
示例:
  1. create database db1 charset=utf8;
  2. create database if not exists db1 charset=utf8;
复制代码
删除数据库
  1. drop database 数据库名称;
  2. drop database if exists 数据库名称;
复制代码
示例:
  1. drop database test;
  2. drop database if exists test;
复制代码
使用数据库
  1. use 数据库名称;
复制代码
查询正在使用的数据库
  1. select database();
复制代码
小结:
命令作用示例show databases;
查看全部数据库show databases;
create database if not exists 数据库名 charset=utf8;创建数据库create database if not exists db1 charset=utf8;use 数据库名;使用数据库use db1;select database();
查看当前使用的数据库select database();
drop database if exists 数据库名;删除数据库drop database if exists db1; 5.2 表、列的DDL

列的内容可以是数字、字符串、时间等,由数据范例束缚
   在满意业务需求的哀求下,数据范例范围选择越小的。
  数值数据范例
数据范例字节数有符号无符号tinyint1个字节-128~1270~255smallint2个字节-32768~327670~65535mediumint3个字节-8388608~83886070~16777215int4个字节-2147483648~21474836470~4294967295bigint8个字节-263~263-10~2^64-1float单精度,4个字节-231~231-10~2^32-1double双精度,8个字节decimal[M, D]双精度,8个字节 decimal(5,2),表现共5位数字,其中2位是小数,比如:888.88
字符串数据范例
数据范例长度用途char(size)最大255个字符数据是定长,如md5的密码,邮编,手机号,身份证号等varchar(size)最大65535个字节存放一样平常内容长度tinytext最大255个字节text最大65535个字节mediumtext最大16777215个字节大段文本时,如消息、文章、论文等longtext最大4294967295个字节大段文本时,如消息、文章、论文等 1、VARCHAR(size):0~65535字节 可变长度字符串,最大65532字节,1-3个字节用于记载巨细【utf8编码size最大21844字符,gbk编码最大32766字符 】
2、查询速度:char > varchar
3、text与char、varchar差别的是,text不可以有默认值,能用varchar的地方不用text
日期+时间数据范例
数据范例格式date年-月-日,如:2024-4-8datetime年-月-日 时:分:秒,如:2024-4-8 16:17:40timestamp年-月-日 时:分:秒,如:2024-4-8 16:17:40time时:分:秒,如:16:17:40year年,如:2024 datetime保存时间的范围: 1000-01-01 00:00:00 到 9999-12-31 23:59:59
timestamp保存时间的范围: 1970-01-01 00:00:01 到 2038-01-19 03:14:07
展示当前数据库全部表
  1. show tables;
复制代码
形貌表布局
  1. desc 表名;
复制代码
查看表的创建语句
  1. show create table 表名;
  2. show create table user;
复制代码
创建表
  1. create table 表名(
  2.                 字段名1 数据类型,
  3.                 字段名2 数据类型,
  4.                 ...
  5.                 字段名n 数据类型  # 最后一个不需要逗号(,)
  6. );
  7. 示例:
  8. create table if not exists user(
  9.                 id tinyint,
  10.                 username varchar(32),
  11.                 age tinyint
  12. );
复制代码
删除表
  1. drop table 表名称;
  2. drop table if exists 表名称;
复制代码
修改表、列
  1. # 修改表名
  2. alter table 原来的表名 rename to 新的表名;
  3. 示例:
  4. alter table user rename to users;
  5. # 增加一列
  6. alter table 表名 add 列名 数据类型;
  7. 示例:
  8. alter table users add height float;
  9. # 修改列数据类型
  10. alter table 表名 modify 列名 新数据类型;
  11. 示例:
  12. alter table users modify id int;
  13. # 修改列名和数据类型
  14. alter table 表名 change 列名 新列名 新数据类型;
  15. 示例:
  16. alter table users change id no tinyint;
  17. # 删除列
  18. alter table 表名 drop 列名;
  19. 示例:
  20. alter table users drop height;
复制代码
小结:
命令作用show tables;
查看当前数据库中全部表desc 表名;
查看表布局show create table 表名;查看表的创建语句alter table 表名 rename to 新的表名;修改表名alter table 表名 add 列名 范例;添加字段alter table 表名 modify 列名 范例及束缚;修改字段数据范例alter table 表名 change 原名 新名 范例及束缚;修改字段名和数据范例alter table 表名 drop 列名;删除字段drop table 表名;删除表 6. DML

6.1 添加数据

添加指定列数据
  1. insert into 表名(列名1,列名2...) values(值1,值2...);
复制代码
添加全部列数据
  1. insert into 表名 values(值1,值2...);
  2. 示例:
  3. insert into users values(1, 'zhangsan', 18);
复制代码
批量添加指定列数据
  1. insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...)...;
复制代码
批量添加全部列数据
  1. insert into 表名 values(值1,值2...),(值1,值2...)...;
  2. 示例:
  3. insert into users values(1, 'lisi', 18),(1, 'wanger', 19);
复制代码
6.2 修改数据

修改表数据
  1. update 表名 set 列名1=值1 列名2=值2...[where条件];
  2. 示例:
  3. update users set no=2 where username='lisi';
复制代码
注:如果不加where条件,就是对该表全部行内容进行修改
6.3 删除数据

删除表数据
  1. delete from 表名 [where条件]
  2. 示例:
  3. delete from users where username='wanger';
复制代码
注:如果不加where条件,就是对该表全部行内容进行删除
7. DQL

完备语法
  1. SELECT
  2.         字段列表
  3. FROM
  4.         表名列表
  5. WHERE
  6.         条件列表
  7. GROUP BY
  8.         分组字段
  9. HAVING
  10.         分组后条件
  11. ORDER BY
  12.         排序字段
  13. LIMIT
  14.         分页限定
复制代码
  1. - 创建数据库
  2. create database if not exists db1
  3. - 创建数据库表
  4. use db1;
  5. create table if not exists stu(
  6.         id int(11),
  7.     username varchar(32),
  8.     sex tinyint(1),
  9.     age tinyint(3),
  10.     math tinyint(3),
  11.     chinese tinyint(3)
  12. );
  13. - 添加数据
  14. insert into stu values(1,'小张',1,16,75,86),(2,'小李',1,16,76,86),(3,'小王',0,17,76,87),(4,'小胡',0,17,77,87),(5,'小丘',0,18,77,88),(6,'小刘',0,18,80,90);
复制代码
7.1 底子查询

  1. - 查询指定字段
  2. select id,username from stu;
  3. - 查询表所有字段
  4. select * from stu;
  5. - 去除重复记录
  6. select distinct sex from stu;
  7. - 字段取别名
  8. select id,sex as gender,math shuxue from stu;
复制代码
7.2 条件查询

  1. select 字段列表 from 表名 where条件
复制代码
where后面支持多种运算符
运算符功能形貌比力运算符=、>、>=、<、<=、!=、<>逻辑运算符and、&&、or、||、not模糊查询like范围查询between…and…、in(…)空判断is null、is not null 模糊查询使用like关键字,可以使用通配符进行占位
_:代表单个任意字符
%:代表任意个字符
正则表达式
  1. select * from stu where class_id REGEXP '1|7';
复制代码
7.3 排序查询

  1. select 字段列表 from 表名 order by 排序字段名1 [,排序字段2]...;
复制代码
注:排序方式有上序ASC,降序DESC,默认环境下是升序ASC
  1. select * from stu order by math desc,chinese desc;
复制代码
7.4 聚合函数

在进行查询操纵时,每每必要对一整列进行运算,例如成绩的均匀分
函数名功能count(列名)统计数量(一样平常选用不为null的列)max(列名)最大值min(列名)最小值sum(列名)求和avg(列名)均匀值
  1. select 聚合函数 from 表名;
复制代码
注:NULL值不到场聚合函数运算
7.5 分组查询

  1. select 字段列表 from 表名 [where分组前的条件限定] group by 分组字段名 [having 分组后的条件过滤];
复制代码
注:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
  1. select sex,max(math),max(chinese) from stu group by sex;
复制代码
7.6 分页查询

  1. select 字段列表 from 表名 limit 查询起始索引,查询条目数
复制代码
注:limit关键字中,查询起始索引是从0开始的
8. 束缚

束缚是作用于数据库表中列上的规则,用于限制添加数据的举动。从而保证数据库中数据的正确性、有效性和完备性。
8.1 束缚分类

束缚范例关键字功能非空束缚NOT NULL保证列中全部数据不能有NULL值唯一束缚UNIQUE保证列中全部数据各不雷同主键束缚PRIMARY KEY主键是一行数据的唯一标识,要求非空且唯一默认束缚DEFAULT保存数据时,未指定值则采用默认值外键束缚FOREIGN KEY外键用来让两个表数据建立关联,保证数据的同等性和完备性查抄束缚CHECK保证列中的值满意某一条件
  1. create table if not exists stu(
  2.         id int(11) unsigned auto_increment primary key not null,
  3.     username varchar(32) not null unique,
  4.     sex tinyint(1) default 1 not null,
  5.     age tinyint(3) not null,
  6.     math tinyint(3) default 0 not null,
  7.     chinese tinyint(3) default 0 not null
  8. );
复制代码
9. 多表查询

一次性从多张表中查询必要的数据
  1. create table class(
  2.         class_id int(11) unsigned auto_increment primary key not null,
  3.     class_name varchar(32) not null unique
  4. )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;
  5. create table stu(
  6.         stu_id int(11) unsigned auto_increment primary key not null,
  7.     class_id int(11) not null,
  8.     stu_name varchar(32) not null unique
  9. )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;
  10. insert into class(class_name) values('一班'),('二班');
  11. insert into stu(class_id,stu_name) values(1,'小张'),(1,'小李'),(2,'小孙'),(2,'小杨');
复制代码
在MySQL中多表查询分为连接查询和子查询,连接查询又分为内连接和外连接,内连接又分为隐式内连接和体现内连接,外连接又分为左外连接和右外连接。
9.1 内连接查询

  1. - 隐式内连接查询
  2. select 字段列表 from 表1,表2... where 条件;
  3. - 显式内连接查询
  4. select 字段列表 from 表1 [inner] join 表2 on 条件;
复制代码
示例
  1. - 隐式内连接查询
  2. select * from class,stu where class.class_id=stu.class_id;
  3. - 显式内连接查询
  4. select * from class inner join stu on class.class_id=stu.class_id;
复制代码
9.2 外连接查询

左外连接查询:相当于查询A表全部数据和交集部门数据
右外连接查询:相当于查询B表全部数据和交集部门数据
  1. - 左外连接查询
  2. select 字段列表 from 表1 left [outer] join 表2 on 条件;
  3. - 右外连接查询
  4. select 字段列表 from 表1 right [outer] join 表2 on 条件;
复制代码
示例
  1. select * from stu left outer join class on stu.class_id=class.class_id;
  2. select * from stu right outer join class on stu.class_id=class.class_id;
复制代码
9.3 子查询

指查询中嵌套有查询
子查询语句效果是单行单列,子查询语句作为条件值,使用>、>=、<、<=、=、!=等进行条件判断。
  1. # class_id 大于 1班的class_id的学生
  2. select * from stu where class_id > (select class_id from class where class_name='一班');
复制代码
子查询语句效果是多行单列,子查询语句作为条件值,使用in等关键字进行条件判断
  1. # 查询存在班级的学生
  2. select * from stu where class_id in (select class_id from class);
复制代码
子查询语句效果是多行多列,子查询语句作为虚拟表
  1. select * from stu,(select * from class) c where stu.class_id=c.class_id;
复制代码
10. 事件

使用场景:转账、下单扣库存
语法:
  1. # 开启事务
  2. start transaction;
  3. begin;
  4. -- 执行各种操作
  5. # 回滚事务
  6. rollback;
  7. # 提交事务
  8. commit;
复制代码
事件特性:
1、原子性,事件是不可分割最小操纵单元,要么同时乐成,要么同时失败
2、同等性,事件完成时,必须使全部数据都保持同等状态
3、隔离性,多个事件之间,操纵可见性
4、持久性,事件一旦提交或回滚,它对数据库中数据的改变是永久的
10.1 隔离级别

数据库事件的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。在事件的并发操纵中大概会出现脏读,不可重复读,幻读。
读未提交(Read uncommitted):
解释:
  1. 一个事务读到了另一个事务还没有提交的数据。
复制代码
例如:
  1. A给B转账,
  2. A转给B,10万,点转账,但未点确认
  3. B查账户看到10万
  4. A及时发现,点撤回,修改为1万,再点转账,再点确认
复制代码
分析:
  1. A给B最终转账是1万,但是在过程中,B能看到过程数据。这就是脏读。
复制代码
读已提交(Read committed):
解释:
  1. 一个事务要等另一个事务提交后才能读取数据。
复制代码
例如:
  1. 父亲的银行卡有10万
  2. 儿子拿着这个银行卡去买单,同时父亲准备转款(开启事务)。此时儿子看到银行卡里有10万
  3. 等儿子看完有10万后,钱被父亲转走,并提交
  4. 收费系统准备在这个银行卡扣款,再次检测,发现卡里没有钱了
复制代码
分析:
  1. 这就是读已提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。
  2. 这个例子中,有读两次卡里的钱,一次是10万,一次是没有钱了,这就是不可重复读。
复制代码
可重复读(Repeatable read):
解释:
  1. 同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。
复制代码
例如:
  1. 父亲的银行卡有10万
  2. 儿子拿着这个银行卡去买单,此时儿子看到银行卡里有10万,这个时候父亲想转账,发现转不了
  3. 等儿子买完单,父亲才能够实行转账行为
复制代码
分析:
  1. 读数据的时候,不允许该数据有写数据的事务。因为写数据会改变数据。这样子就解决了不可重复读的问题。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
复制代码
什么时候会出现幻读?
解释:
  1. 一个事务读取到了另一个事务新增的数据
复制代码
例如:
  1. 儿子某一天去消费,花了8千元,然后他的父亲去查看他今天的消费记录(全表扫描,儿子事务开启),看到确实是花了8千元,就在这个时候,儿子花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当父亲打印儿子的消费记录清单时(儿子事务提交),发现花了1.8万元,似乎出现了幻觉,这就是幻读。
复制代码
串行化(Serializable):
解释:
  1. 它是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率最低,比较耗费数据库性能,一般不推荐使用。
复制代码
小结:
隔离级别脏读不可重复读幻读读未提交大概出现大概出现大概出现读已提交不会出现大概出现大概出现可重复读不会出现不会出现大概出现串行化不会出现不会出现不会出现 隔离级别查询
  1. -- MySQL8以前
  2. SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
  3. -- MySQL8开始
  4. SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;
复制代码
修改隔离级别
  1. -- 建议开发者在修改时,仅修改当前session隔离级别即可
  2. -- REPEATABLE-READ,MySQL默认级别
  3. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE-READ
复制代码
11. 函数

11.1 数学函数

函数含义abs(x)返回x的绝对值rand()返回0到1的随机数mod(x,y)返回x除以y以后的余数power(x,y)返回x的y次方round(x)返回离x近来的整数round(x,y)保留x的y位小数四舍五入后的值sqrt(x)返回x的平方根truncate(x,y)返回数字 x 截断为 y 位小数的值ceil(x)返回大于或等于 x 的最小整数floor(x)返回小于或等于 x 的最大整数greatest(x1,x2…)返回返回集会合最大的值least(x1,x2…)返回返回集会合最小的值 11.2 字符串函数

函数含义trim()返回去除指定格式的值concat(x,y)将提供的参数 x 和 y 拼接成一个字符串substr(x,y)获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用雷同substr(x,y,z)获取从字符串 x 中的第 y 个位置开始长度为z 的字符串length(x)返回字符串 x 的长度replace(x,y,z)将字符串 z 替换字符串 x 中的字符串 yupper(x)将字符串 x 的全部字母变成大写字母lower(x)将字符串 x 的全部字母变成小写字母left(x,y)返回字符串 x 的前 y 个字符right(x,y)返回字符串 x 的后 y 个字符repeat(x,y)将字符串 x 重复 y 次space(x)返回 x 个空格strcmp(x,y)比力 x 和 y,返回的值可以为-1,0,1reverse(x)将字符串 x 反转 11.3 日期函数

函数含义current_date()当前日期current_time()当前时间current_timestamp()当前时间戳 12. DCL

12.1 用户管理

创建用户
  1. CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
  2. -- 实例:
  3. CREATE USER 'java'@'%' IDENTIFIED BY 'asd123crl';
复制代码
删除用户
  1. drop user 用户名@IP;
  2. -- 实例:
  3. drop user 'java'@'%';
复制代码
修改密码
  1. UPDATE `user` SET `Password` = PASSWORD('新密码') WHERE `User` = '用户名';
  2. -- 实例:
  3. UPDATE `user` SET `Password` = PASSWORD('asd123') WHERE `User` = 'java';
复制代码
12.2 权限管理

常用权限:

查看用户权限命令
  1. SHOW GRANTS FOR '用户名'@'主机名';
  2. -- 实例:
  3. SHOW GRANTS FOR 'root'@'%';
复制代码
给用户授予权限
在MySQL中使用GRANT命令给用户授权,如果用户不存在,GRANT会主动创建用户,并进行授权。
  1. GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';  -- 权限列表中如果有多个权限则用逗号,隔开
  2. -- 授权所有库的所有表的所有权限
  3. GRANT ALL ON *.* TO '用户名'@'主机名';  
  4. -- 示例:给张三赋予db_test数据库students表的查询权限
  5. GRANT SELECT ON db_test.students TO 'zhangsan'@'localhost';
  6. -- 刷新权限
  7. flush privileges
复制代码
撤销权限
  1. REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
  2. -- 示例:撤销张三在db_test.students表的查询权限
  3. REVOKE SELECT ON db_test.students FROM 'zhangsan'@'localhost';
  4. -- 刷新权限
  5. flush privileges
复制代码
13. 备份与还原

备份语法:
  1. mysqldump -h 服务器 -u 用户名 -p -B 数据库名1 数据库2 数据库n > 备份文件.sql
复制代码
示例:
  1. mysqldump -u root -p -B test > /backup/123.sql
复制代码
还原语法:
  1. mysqldump -h 服务器 -u 用户名 -p密码 --databases 数据库名 < 备份文件.sql
  2. # 进入数据库后
  3. source 备份文件.sql;
复制代码
示例:
  1. mysqldump -u root -p --databases test < /backup/123.sql
复制代码
一样平常系统保举的字符集和排序规则
  1. # 字符集
  2. utf8mb4
  3. # 排序规则,不区分大小写
  4. utf8mb4_general_cli
复制代码
字符集(Character Set):utf8mb4
排序规则 | 字符序(Collate):utf8mb4_general_cli 或 utf8mb4_bin


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4