开发者学堂课程【7天突破PolarDB for PostgreSQL 2022版:从 Oracle/MySQL 到 PolarDB(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/992/detail/14975
12、表与数据存储方式
Oracle :数据存在哪
表空间--〉数据文件-->段-->区-->块
MySQL︰数据存在哪
mysql> show variables like 'datadir
Variable_name Value
datadir/mysql/product/data/ l
/mysql/product/data/数据库名/表名.frm :表相关元数据/ mysql/product/data/数据库名/表名.ibd :表数据文件
多个数据文件可以构成一个表文件,表文件是建立在表空间中的,表空间包含哪些表文件,数据空间就在哪些表文件中,对于数据文件的使用,又分为段、区、块。
基本上这些数据库都是一样的方式,表空间,数据文件,段、区、块。Mysql的数据文件位于 mysql/product\data,有一个目录,Oracle 会做的更好一些,更好一些,oracle 是把多个数据文件以物理的方式结合在一起,其实就相当于起到了屏蔽文件系统的作用,数据就包含在表空间里面,比如说表文件里面包含十个数据文件,十个数据文件在 Oracle 里面怎么分配,就由 orcale 来决定不由操作系统来决定,因为目前还都是放在操作系统的文件里,但是 paradb 是有自己的存在分离系统,这个系统还没有进行深入研究会不会有自己的变化还不太稳定,可以去了解 polarDB 相关的资料,基础的polarDB版本,也就是基础的一个表对应一个版本跟 mysql 一样一个版本对应一个文件,orcale 是表放到表空间里面,一个表空间中可以有多个表文件,通常来说一个表跟一个表空间是一对一的关系。
PolarDB:数据存在哪?
postgres=# \d+
List of relations
Schema | Name | Type l ownerl size Description--------+------+-------+----------+--------+------------public [ rr11 | table l postgres | 232 kB l
(连接数据库为postgres)
postgres=# select oid, datname from pg_database;oidl datname
-------+-----------13287 | postgres
postgres=# select oid,relfilenode from pg_class where relname='rr11';relfilenode
16419
PolarDB数据库对应目录/base/13287/16419 : rr11表对应数据文件
-rw---r--- 1 postgres postgres 24576 Ju1 28 202116419_fsm
PolarDB 数据库对应目录/base/13287/16419_fsm :用于空间管理的文件有可能还有*_vm文件:用于 vaccum 管理
更简单的方式:
select pg_relation_filepath( 't1');
lpostgres@locaThost pgdata3s
Lpostgres@1ocaThost pgdata3s psql -p6016psql 12.1, server_1i.25)
Type "he1p" for he1p.postgres=# \d+
List of relations
schema [ Name [ Type owner l size| Description--------+------+-------+----------+--------十-----------public i rr11table i postgres i 232 kB
i row)
postgres=# \d
List of relations
schema [ Name | Typelowner--------+------+-------+----------public i rr11 | table l postgresrow)
postgres=#
可以查看到目前有一个表叫做 rr11,这个表有232kb,在这个地方要先找一个数据库,这个表属于 postgres 这个数据库,这个数据库有个目录号13287,还可以查询一下这个表的对象号。对象号是16419。也就是这个表对应的数据库就是在polarDB对应的目录下面,对应的目录是哪个呢
[root@localhost~]# su - postgresLast login: wed Apr 13_18:59:32 csT 2022 on pts/2[postgres@1oca1host -]s cd /data/pgdata3
[postgres@localhost pgdata3]5
[postgres@locaThost pgdata3jsLpostgres@locaThost pgdata3js 1s
-rw---r--- 1 postgres postgres 24576 Ju1 28 202116419_fsm
有兴趣可以研究 polarDB 的数据格式。最大的数据库目录就是base,
二、数据库、schema 与 owner>Oracle 中的数据库、Schema 实例
数据库
用户与 Schema
之前一节课讲了一些很基本的连接,进程,启动,关闭,线程以及怎样找到数据文件,然后接下来从数据库稍微内部一点的东西开始说起,例如先讲解一些 Oracle 中的数据库,schema 实例等的一些东西。
实例指的是内存,进程,也就是启动数据库所占用的内存。
它的更重要的进程,有一个 MySQL-D 更大的进程,这个进程一启动就是实例。
数据库就是一个实例可以针对多个数据库,数据库有点像 oracle12C 之后有个 pldb,这个跟 pldb 的数据库很像。数据库就是自成一个整体,有自己的源数据,以及相关的一些数据。可以有一个 aa 用户也可以有其他用户。
一个实例可以对应多个数据库,一个实例的另一个数据库也可以有另外一个aa用户。每个数据库都是相互独立的,oracle 早期就是一个实例对应一个数据库,后来从12C之后增加了 pdb,就能够一个实例对应多个数据库。polarDB 之前的版本从很早就是一个实例对应多个数据库,就类似于多租户的关系,oracle12DB 才开始支持 pdb,多租户的关系,还没有像之后功能那么强大,能够覆盖百分之五六十的功能,只是说polarDB 到这的功能是可以的,也足够使用了,没有继续往这个方向继续开发,实例是进程加内存,数据库就是指数据文件等等就是指数据库,包括你的表,表对应的文件等就是数据库,A 数据库里可以有 A1表,B 数据库里也有一个 A1表,里面同样还可以有同样的用户,这是不冲突的。
用户是用来决定是否连接,能够做某个操作,用来限定用户端的操作,用户如果跟权限连接起来,给用户什么样的权限,就能够进行什么样的操作,用户与 Schema 是深度绑定的,建立一个A用户就会有一个 A 用户的 schema,这个词的意思就是方案,类似于架构的意思,相当于一套软件体系,跳出数据库,从应用角度来说,这套应用针对以前的用户来说建立一套 schema,给这个应用去用,也就是从应用架构上来说拿出了一个概念。表也属于 schema,对 oracle 来说既属于用户,也属于 schema。用户与 schema 属于一个概念,MySQL 中
1、数据库、schema 与 owner>MySQL 中的数据库、Schema 与 owner 数据库即目录早期的版本,创建一个目录,即是一个数据库
直接到 MySQL 总目录下建立一个子目录,然后搜 datenase 就能看到多了一个数据库。所以 mysql 的数据库跟 oracle 的 adb 是完全不同的。跟 polarDB 中的数据也完全不同,这个就太简单了,所以不能算是多租户的概念。polarDB 可以算作是多租户的概念,
数据库、schema 与用户: PolarDB 篇用户:与权限一起,决定能不能做某样操作schema :表的属主,逻辑上划分表。表属于某个 schema,表默认都属于 public schema。不同 schema 中的表,可以重名。可以跨 schema 访问表。
数据库∶物理上决定着表的存储位置。对应 Oracle 12c 后的 PDB。·不能直接跨数据库访问表,只能通过 dblink 形式跨库访问表·不同数据库,可以有重名的 schema 每个数据库有自己的原数据,但共享 xlog 等公共资源
表物理上属于某个数据库,存在数据库某个相关的配置,也就是数据库可以决定表如何存放已经存放的位置,数据库可以有不同的目录,但是不由 schema 决定。数据库就是决定表的存储位置,存储目录等等资源,schema 是针对开发应用,两个有共同之处,也就是表属于谁,对于开发来说并不关系位于哪个目录中,也不可能让开发登录到数据服务器上。开发决定的是表属于A用户,属于 B 用户等等。甲用户能不能访问A用户里面的。这是开发所需要关注的问题,所以 schema 跟数据库两个概念是合起来的。一个是针对开发,一个是针对操作系统,资源。这是两者的区别。
还有一个用户:用户要与权限在一起,决定能不能做某样操作,oracle 同时具备schema 与权限的功能。用户也是与权限绑定在一起,连接需要有一个权限,没有权限就无法连接。对于用户有一个特定的 schema。这是用户,权限与 schema 这三个的概念,schema 与用户相当于一体两面,同时用来决定表的属主,一个用来决定资源的属主,另一个用来决定哪个用户,所以三个应该结合起来,三位一体。
2、操作
postgres=# create database db2;
CREATE DATABASE
postgres=# select oid,datname from pg_database;oid l datname
16441 | db2cd base/16441/
[postgres@localhost 16441]$ ls -lFrt / wc -l295
创建数据库后,对应目录中就有295个与表相关的文件,这些都是元数据文件。PolarDB 与 MySQL 不同,与 oracle 的 PDB 更类似。
MySQL 的数据库如果进行创建就是一个空的目录,老师就不建立了,如果想建立可以自己进行建立来比对。如果是 pg 不一样就建立一个 db3,如果建立一个pg就会在base 下面多一个,进入 dba3中查看发现多了很多源数据。多了很多源字典,oracle也是一样,oracle 中的 pdb,新建一个 pdb 也会有她自己的源数据,因为还存在模板 pdb,
1 template1
13286 template
13287 postgres
16441 db2
16424 db1
16454 db3
(6 rows)
每次建立 pdb 是通过查看模板中有什么源数据,然后将其复制,复制一遍当作新的pldabe。这跟 mysql 是完全不同的概念,
[mysql@1ocalhost ~js mysql -uroot -proot -P6015
mysq1:/1ib64/1ibstdc+t.so.6: version GLIBCxX_3.4.21' not found (required by mysq1)mysq1:/1ib64/1ibstdc++.so.6: version CxxABI_1.3.9' not found (required by mysq1)Jmysq1:/[1ib64/1ibstdc++.so.6: version `GLIBCxx_3.4.20' not found (required by mysq1)LmysqlalocaThost ~]5
mysql> show _variables like 'datafir ';Empty set (o.00 sec)
mysq1> show variables like 'datadir'
variable_name / value
datadir
/mysgl/product/data/
------------+-----LA----------------i row in set (o.00 sec)
mysq1> l
建立一个目录,
mysql> show _variables like 'Natafir';Empty set (o.00 sec)
mysql> show variables like 'datadir
variable_name i value
datadir
/mysq1/product/data/ i
i row in set (0.00 sec)
mysq1>、
建立一个数据库:
mysql> create database mydb1;
Query oK,i row affected' (o.oo sec)mysq1>
查看到直接多了一个 mydb1,建立的时间是20.04,
lroot@1ocalhost data]# cd mydb1[root@locaThost mydbi#1s -1Frttotal 4
-rw-r-----_1 mysql mysq1.67 Apr_13 20:04 db.opt[root@localhost mydb1]# 1s -lFrta
total 8
-rw-r----- 1 mysql mysql67 Apr 1320:04 db .optdrwxr-x--- 8 mysql mysq1 4096 Apr 13 20:04
drwxr-x---_2 mysql mysgl20 Apr 13 20:04[root@locaThost mydbi1j#
里面也存在一个文件,属于字符集,属于数据库的字符集。这就是mysql数据库,也就是一个数据目录,早期版本中也有介绍。
root@localhost mydb1]#cd..
lrootaiocalhost datai#mkdir mydb2
[root@locaThost data]# mydb1/db.opt mydb2/
mysql> show databases;
Database
information_schemacep
mydb1db2mysgi
performance schemasys
test
polardb 可以作为多租户概念去使用,
Pdb的区别在于多了很多插拔的概念,就是可以将一个 pdb 拔出,插入到另外一个实例中,但是 pg 在这一块并没有做更多的东西,假如 pg 里面有个我建的 db3,我想把它拔出,插入另一个数据库中好像做不到,也不是做不到只是并不像 oracle 那种仅仅通过插拔就可以做到,当然也可以通过一些数据迁移的方式,将数据备份出来,将数据粘贴过去然后恢复一下也可以。其实 orcale 就是使用了这一种备份与恢复的方式来进行。但是实现插拔还是需要很多工具量,并不是说将数据插拔然后封装一下就行了。也并没有那么简单,还是设计到一些源数据层面的东西。
3、表空间与数据库
oracle 与 MySQL 篇决定文件分布 Oracle 表空间由多个数据文件构成 MySQL 表空间对应一个目录,类似 PolarDB
Orical 早期的时候一个著名的 db 曾经说过,orical 相当于穷人的条带,条带现在说的都比较少了,是指存储的条带。用来分布数据,现在条带也是用来分布数据,在linux 里面建立 vige,建立vige也是有条带的,表空间其实也就是条带化,建立表的时候以区为空间,一个区假如是一兆,例如第一个1兆来自数据文件一,第二个一兆来自数据文件2等等,是分布式的,是分散开来的。
Mysql 的表空间对应一个目录,这一点类似于 polardb,
4、表空间与数据库:PolarDB 篇
mkdir -p /data/tablespaces/tps1:
表目录,mysql 一个表对应一个文件,
postgres=# CREATE TABLESPACE tps1 LOCATION '/data/tablespaces/tps1';CREATE TABLESPACE
db1=# create table t3(c1 varchar(20), id int) tablespace tps1;CREATE TABLE
db1=# select pg_relation_filepath( 't3 ' );
pg_relation_filepath
pg_tblspc/16443/PG_11_201809051/16424/16444
16443是什么∶
db1=# select oid,* from pg_tablespace;
oidl spcnamel spcowner / spcacl \ spcoptions
16443 \ tps1
10 l
16424 :数据库的 OID,t3表存储在 postgres 数据库中
16444 :表 t3自身的 OID
pg_tblspc 是什么?
建立t3,对应的就是
pg_tblspc/16443/PG_11_201809051/16424/16444
这个位置,因为路径是 data/tablespaces/tps1。路径中没有 pg_tblspc。这个路径是什么,之后再讲解。16443是表空间的 id.16443就是表对应的对限号。表就放在16443下面,并且在下面建立了一个子目录。PG_11_201809051。16424是数据库的oid,在一个表空间里放置了数据库,这一个目录里可以有多个数据库。按照数据库可以存放多个表目录。表空间是实例集。多个数据库可以同时使用。类似于数据库,数据文件,缺省数据库位于 base 中,最后这个数据库就是缺省实例的数据库。在数据库实例下面有参数文件,base 目录。那么数据库所属的目录都在数据库目录下面,这是pg的表空间,也就是数据库的东西。
5、pg_tblspc是什么?
postgres=# create table t3(c1 varchar(20),id int) tablespace tps1;CREATE TABLE
postgres=# select_pg_relation_filepath( 't3');
pg_relation_filepath
i2pg_tblspc/16443/PG_11_201809051/13287/16455( row)
postgres=#
连接的数据库是13287。相当于在16443这个表空间中又建立了一个表,是属于跟这个数据库不同的数据库,
6、注意实例与数据库
oracle :
数据库实例与表空间没有关系。表空间中数据文件可以位于任何位置
实例级相关的数据,在 ORACLE_HONE 中。比如,监听配置文件 listener.ora,一台服务器上的多个数据库可以共享同一个 listener .ora。listener.ora 位于$0RACLE_HOME/network /admin/中,它是属于实例的。
PolarDB:数据库实例对应一个固定的位置。initdb 初始化一个数据库实例、以及在启动数据库实例时,都要指定一个位置:
pg_ctl -D / data/pgdata3 start
这个位置中有实例的各种配置文件,这些都是独立于各个数据库的。
(如,配置参数文件 postgres.conf,就属于实例级的,它不属于任何一个数据库。)
实例所有的文件(〈包括所有数据库的所有文件),都要在""/data/pgdata3目录中,但表空间可以在"/data/pgdata3"目录之外。违反了这一基本原则。
解决方法:
/data/pgdata3/pg_tblspc
中,放置一个指向表空间位置的软链接。db1=# select pg_relation_filepath( 't3');
pg_relation_filepath
pg_tblspc/16443/PG_11_2e1809051/16424/16444pg_tblspc:
它的作用,就如上面所述。
Mysql 的表空间跟 pg 非常像,但是数据库的概念不同,所以 mysql 就不再对比这个东西了。表空间属于实例概念,所以叫做数据库实例。如果没有缺省的概念,那么所有的数据库都位于同一个总的目录下面。
Oracle 的位置比较随意,创建的时候位置都是随意放置的。创建数据库的时候源数据不同,元数据的位置可以随意放置。但是 pg,MySQL 都有一个初始的目录。
Pg 和数据库所有的目录都要位于/data/pgdatas。相当于一个规定,所有数据库都要位于这个目录中。但是表空间不在了,现在更换了目录,如何保证所有的目录仍旧处于/data/pgdatas
解决方法:
放置了一个指向表空间位置的软连接,因为硬连接只能指向表文件,
[postgres@1ocaThost pgdata3]s pwd7data/pgdata3
[postgres@localhost pgdata3]s_cd_pg tb1spclpostgres@localhost pg_tblspc]$ 1s-1Frttotalo
1rwxrwxrwx 1 postgres postgres 22 Apr 2 11:5116443 ->/data/tablespaces/tps1/[postgres@1ocalhost pg_tb1spc]sl
Tps1属于总目录下的 pg_tblspc 下的子目录:16443,也就符合所有数据库都位于目录里面,软链接看起来就是位于目录中,
[postgres@1oca1host pg_tb1spc]$ cd 16443Lpostgres@1ocalhost_ i6443]s' pwd
/data/pgdata3/pg_tb1spc/16443lpostgres@1ocaThost 16443]$ l
看上去原理相同,实际上相当于虚线汇报,目录虚线汇报给总目录,作用就是用来存放虚线汇报关系的软连接的目录,就是这一串名字的由来。用来保存虚线对应关系的目录,表空间的对象号,以及避免重复的字符串,数据库的对限号,以及表的对限号。
7、表空间与数据库: Oracle/MySQL 与 PolarDB 总结
oracle :
一个表空间最多包括1024个数据文件
oracle 在多个数据文件中做类似条带的/o分配操作
MysQL、PolarDB:
表空间是一个目录
Oracle 一个块是8k,数据文件最大是32g,一个表空间最多是1024个文件,也就是32t,还是挺大的,不过也有超出的可能,如果表数量达到了可以扩。如果每个数据文件都达到了32g,那就没办法了。这是一个限制。
MysQL、PolarDB:就无所谓了都是一个目录,为什么 orcale 的表空间看起来比其他两个要高级一点,因为相当于自己进行了小存储,有条带,类似于条带的东西。因为早期的数据文件只能有4g那么大,32位,计算机长期以来都是这个系统,一个数据文件早期是4g,一个表空间对应一个文件,那么最多也是有4g。
早期的时候有一段时间 ingress 失败了,失败有一定原因是因为 SQL,后来慢慢sql成为标准了,用户还是觉得sql更方便。但是早期 orcal 跟 ingress 一度达到过同一量级,所以后来 orcale 联合 imadb 做 sql 的标准,ingress 没有跟上脚步,导致虽然ingress 当时的发展势头很猛,但是从占有率来说并不是老大。
最终慢慢被 sql 这个标准兼容了。因为用户假如要使用数据库还要重新学语言就比较麻烦,sql 要掌握好是挺复杂的,sql 就是入门比较简单,但是要学好还是很复杂的。因为不支持,所以学习的欲望就会越来越低,慢慢就变得边缘化了。一些社区就在ingress 的基础上继续开发。
8、用户与权限体系:Oracle/MySQ 篇
oracle:
用户也是 Schema
用户、角色、权限
MysQL :
用户、 schema 分离(和 PolarDB 相同)
用户的作用︰登录数据库的凭据,和权限结合,控制客户端的操作(和 PolarDB 相同)
9、用户与权限体系:PolarDB 篇
创建用户:
CREATE USER u1 WITH PASSWORD '123456';
授权,
GRANT ALL PRIVILEGEs ON DATABASE db1 To u1;
授予所有权限,授予所有权限给某个用户,
GRANT ALL PRIVILEGES ON all tables in schema test1 To u1;\c db1 u1;
授予所有表
\password 传统的创建语句:
create role u1 login password '123456';
postgres=#
\
c dbi u1
psql(12.
1
, server
1
1.2)
You are now connected to database "db1" as user "u1". db1=>
两个数据库都存在 u1用户,但是数据库不一样,可以将常用的基本数据库连接起来组成一个角色。然后将角色位于数据库中。但是在 polarDB 中 role 变成了用户,叫做 u1。
虽然表空间的概念有点像数据库后期突然多了一个这么个概念,跟体系没有浑然天成的感觉,软链接有点像为了实现这个功能,将代码最小化修改的条件下就可以了。
既不违背都位于这一个数据库下的原则,又对数据库没有什么修改。更像后期的功能,mysql 也是一样,很明显能看出是后期加入进来的,跟早期不是一个体系,这套东西很复杂但是也理顺了。有了这些基础之后就可以正式开始学习 polardb 后面的缩影,polardb 中的缩影是非常丰富的。