7天突破PolarDB for PostgreSQL
第四讲 从Oracle/MySQL到PolarDB
主讲人:吕海波,美创科技技术专家
视频地址:
https://developer.aliyun.com/learning/course/992/detail/14975
目录:
一、数据库的连接方式
二、进程与线程
三、数据库的启停
四、数据库的告警日志体系
五、表与数据存储方式
六、数据库、schema与owner
七、表空间与数据库
八、用户与权限体系
一、数据库的连接方式
- 连接Oracle
Oracle的常用连接方式如下:
sqlplus / as sysdba
[oracle@localhost~]$ sqlplus u1/a@192.168.51.214:1521/orcl.mc
系统显示如下信息,连接到Oracle:
SQL*Plus: Release 11.2.0.4.0 Production on 星期五 4月1 17:02:02 2022
Copyright(c)1982,2013,Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
- 连接MySQL
IP方式连接:
[mysql@VAGE01 ~]$ mysq1 -usystem -pOracle1 -hlocalhost -P3306 -Dvage
参数说明:
-u:用户名
-p:密码
-h:IP或主机名
-P:端口号,默认3306
-D:数据库名
系统显示如下信息后,连接到MySQL:
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with; or \g.
Your MysQL connection id is 4
Type ‘help;’or‘\h’for help. Type‘\c’to clear the current input statement.
mysql>
3.连接PolarDB
a.本地连接
[postgres@localhost pg]$ ./prebuild/bin/psql –p 6016
参数说明:p6016,指定端口号,如果使用默认端口号5432则可以省略。
系统显示如下信息后,连接到PolarDB:
psql(11.2)
Type “help”for help.
postgres=#
b.远程连接
- 配置文件:vim pg_hba.conf
85 #IPv4 local connections:
86 host all all 127.0.0.1/32 trust
87 host all all 192168.51.1/24 md5
配置完成后,重启生效。
- 连接命令:
[postgres@localhostpg]$ ./prebuild/bin/psql –U postgres –h 192.168.51.214 -d postgres -p 6016
当配置文件中的远程连接参数设置为“md5”时,登录需要密码验证;当参数设置为“trust”时,则无需密码。
- 密码修改:
postgres=# alter user postgres PASSWORD‘abcde’;
ALTER ROLE
postgres=# \q
- 更安全的设置密码
postgres=# \password
Enter new password:(此处输入密码)
Enter it again:(再次输入密码)
postgres=# \q
二、进程与线程
1.进程模式和线程模式
a.进程模式:Oracle,PolarDB
- 进程模式启动比较耗时,适于长连接模式;
b.线程模式:MySQL
- 线程模式启动快,适用于短连接模式;
2.Oracle进程
查看命令:ps -eflgrep ora
oracle 21269 1 0 Mar08 ? 00:04:21 ora_pmon_orcl
oracle 21288 1 0 Mar08 ? 00:01:54 ora_dbwe_orcl
oracle 21290 1 0 Mar08 ? 00:07:54 ora_lgwr_orcl
oracle 21292 1 0 Mar08 ? 00:05:49 ora_ckpt_orcl
oracle 21294 1 0 Mar08 ? 00:00:56 ora_smon_orcl
……
3.PolarDB进程
查看命令:ps-ef|grep postgres
Postgres 9757 1 0 18:00 pts/2 00:00:00/home/postgres/polardb/PolarDB-for-
PostgreSOL/prebuild/bin/postgres-D/data/pgdata3
Postgres 9760 9757 0 18:00? 00:00:00 postgres:checkpointer
Postgres 9761 9757 0 18:00? 00:00:00 postgres:background writer
postgres 9762 9757 0 18:00? 00:00:00 postgres:walwriter
postgres 9763 9757 0 18:00? 00:00:00 postgres:autovacuum launcher
postgres 9764 9757 0 18:00? 00:00:00 postgres:archiver
postgres 9765 9757 0 18:00? 00:00:00 postgres:stats collector
postgres 9766 9757 0 18:00? 00:00:00 postgres:logical replication
launcher
posteres 11268 10852 0 18:24 pts/2 00:00:00 ./prebuild/bin/psgl -U postgres -h 192168.51.214 -d postgres -p 6016 -W
Postgres 11279 9757 0 18:24? 00:00:00 postgres: postgres postgres 192.168.51214(17086) idle
……
4.MySQL线程
查看命令:ps -efT|grep mysqld
mysql 12118 12118 12061 0 18:37 pts/2 00:00:00 /bin/sh
/data/mysq1/app/bin/mysqld_safe --defaults-file=/mysq1/product/mycnf --user=mysql
mysq1 12820 12820 12118 1 18:37 pts/2 00:00:00 /data/mysql/app/bin/mysqld -- defaults-file=/mysql/product/my.cnf --basedir=/data/mysql/app -- datadir=/mysql/product/data --plugin-dir=/data/mysql/app/1ib/plugin --log-
error=/mysq1/product/data/myerror.log --pid-file=localhost.pid -- socket=/tmp/mysql.sock --port=6015
……
三、数据库的启停
1.数据库的启动
a.Oracle的启动
sqlplus / as sysdba
startup
启动三步骤(Oracle和PolarDB类似,而MySQL没有控制文件):
- 打开参数文件;
- 打开控制文件;
- 打开所有数据文件;
b.MySQL的启动
/data/mysq1/app/bin/mysqld_safe --defaults-file=/mysq1/product/my.cnf --user=mysql &
其中my.cnf为参数文件。
c.PolarDB的启动
- 启动方式一:
./prebuild/bin/pg_ctl –D /data/pgdata3 start –l logfile
解析:命令中–D /data/pgdata3指明默认数据库所在的目录,参数文件(postgressql.cnf)就在这个目录中。
- 启动方式二:最直接的启动方式
./prebuild/bin/postgres –D /data/pgdata3
Mysql也可以直接运行可执行文件启动(mysqld)。
2.数据库的关闭
a.PolarDB的关闭:
pg_ctl –D /data/pgdata3 stop
b.MySQL的关闭:
mysqladmin –uroot –proot -S/tmp/mysql.sock -P6015 shutdown
c.Oracle的关闭:
sqlplus / as sysdba
shutdown immediate/abort
四、数据库的告警日志体系
如果遇到数据库无法正常启动的情况,可以通过查看日志发现问题。
- PolarDB日志
cd /data/pgdata3
vim postgres.conf
log destinationcn参数:
364 #log destination=‘stderr’ #Valid values arecombinations of
365 #stderr,csvlog,syslog,and eventlog
366 # depending on platform. csvlog
367 # requires logging_collector to be on.
参数说明:
stderr:屏幕输出错误信息;
csvlog:记录到独立日志文件;
syslog:记录到操作系统日志文件内;
日志文件一般采用csvlog形式,存放于系统目录的log目录下。
- Oracle日志
使用diagnostic_dest参数决定日志文件位置;
- MySQL日志
使用log_error参数配置错误日志位置。
五、表与数据存储方式
1.Oracle
表空间 --> 数据文件 –-> 段–-> 区 –-> 块
Oracle的数据存放在数据文件中,多个数据文件构成表空间,表存放在表空间中。
2.MySQL
mysql> show variables like ‘datadir’;
MySQL的数据文件存放在datadir中,路径是/mysql/product/data;
/mysql/product/data/数据库名/表名.frm:表相关元数据;
/mysql/product/data/数据库名/表名.ibd:表相数据文件;
3.PolarDB
postgres=# \d+
说明:表名称是rr11,连接数据库为postgres,表大小是232KB。
postgres=# select oid, datname from pg_database
说明:13287是postgres数据库的oid。
postgres=# select oid, relfilenode from pg_class where relname=‘rr11’;
说明:16419是表的oid。
PolarDB数据库都在目录/base/下:
PolarDB数据库对应目录/base/13287/16419: rr11表对应数据文件;
PolarDB数据库对应目录/base/13287/16419_fsm: 用于空间管理的文件;
有可能还有*_vm文件:用于vaccum管理;
更简单的方式:
Select pg_relation_filepath(‘rrll’)
六、数据库、schema与owner
1.Oracle中的数据库、Schema与owner
- 实例:指内存和进程;
- 数据库:对应的数据和表文件,一个实例可以对应多个数据库;
- 用户与Schema:用户用来限定数据库的连接和操作权限,Oracle用户和Schema是深度绑定的,Schema的原意是方案,这里是类似应用架构的概念,表属于某个用户,也属于Schema。
2.MySQL中的数据库、Schema与owner
MySQL数据库即目录,早期版本中,创建一个目录即是一个数据库。PolarDB和Oracle属于多租户的概念,MySQL不属于多租户。
3.PolarDB中的数据库、Schema与owner
PolarDB中的数据库、Schema和owner(用户)三位一体:
a.Owner(用户):与权限一起,决定能不能做某样操作;
b.Schema:表的属主,逻辑上划分表;
- 表属于某个schema,表默认都属于public schema;
- 不同schema中的表,可以重名;
- 可以跨schema访问表;
c.数据库:物理上决定着表的存储位置。对应Oracle 12c后的PDB;
- 不能直接跨数据库访问表,只能通过dblink形式跨库访问表;
- 不同数据库,可以有重名的schema;
- 每个数据库有自己的原数据,但共享xlog等公共资源。
操作示例:
postgres=# create database db2;
CREATE DATABASE
postgres=# select oid, datname from pg_database;
cd base/16441/
[postgres@localhost16441]$ ls -lFrt | wc -l
295
- 创建数据库后,对应目录中就有295个与表相关的文件,这些都是元数据文件;
- PolarDB与MySQL不同,与Oracle的PDB更类似。
七、表空间与数据库
1.Oracle与MySQL
- 表空间在Oracle中决定文件的分布;
- Oracle表空间由多个数据文件构成;
- MySQL表空间对应一个目录,类似PolarDB;
2.PolarDB
mkdir –p /data/tablespaces/tps1
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/PG11201809051/16424/16444
解析:
a.t3表放在tps1表空间,对应目录/data/ tablespaces/tps1,这部分与MySQL类似,都是表空间对应目录;
b.pg_tblspc:后面将有叙述;
c.16443:表空间的OID;
db1=# select oid,* from pg_tablespace;
d.16424:数据库的0ID,t3表存储在postgres数据库中;
e.16444:表t3自身的OID;
f.PolarDB中,表空间下可以有多个数据库,按数据库放在多个目录中,表空间是独立于数据库外的,属于实例级别概念,后面会做详细讲解。
3.实例与数据库
a.Oracle
- 数据库实例与表空间没有关系,表空间中数据文件可以位于任何位置;
- 实例级相关的数据,在ORACLE_HOME中,比如,监听配置文件listener.ora,一台服务器上的多个数据库可以共享同一个listener.ora;
- listener.ora位于$ORACLE_HOME/network/admin/中,它是属于实例的;
b.PolarDB
- 数据库实例对应一个固定的位置,initdb初始化一个数据库实例、以及在启动数据库实例时,都要指定一个位置,这一点MySQL与PolarDB相同:
pg_ctl -D /data/pgdata3 start
- 这个位置中有实例的各种配置文件,都是独立于各个数据库的;
(如,配置参数文件postgres.conf,就属于实例级的,它不属于任何一个数据库。)
- 实例所有的文件(包括所有数据库的所有文件),都要在“/data/pgdata3”目录中,但表空间在“/data/pgdata3”目录之外,这违反了基本原则,解决方法如下:
/data/pgdata3/pg_tblspc中,放置一个指向表空间位置的软链接“16443”;
db1=# select pg relation filepath(‘t3'):
pg relation_filepath
---------------------------
pg_tblspc/16443/PG_11_201809051/16424/16444
pg_tblspc: 如上所述,就是用来存放指向表空间位置的软链接。
小结:
- Oracle一个表空间最多包括1024个数据文件;
- Oracle在多个数据文件中做类似条带的I/O分配操作;
- MySQL和PolarDB的表空间是一个目录。
八、用户与权限体系
1.Oracle
- 用户也是Schema;
- 用户、角色、权限;
2.MySQL
- 用户、Schema分离(和PolarDB相同);
- 用户的作用:登录数据库的凭据,和权限结合,控制客户端的操作(和PolarDB相同);
3.PolarDB
创建用户:
CREATE USER U1 WITH PASSWORD123456;
授权:
GRANT ALL PRIVILEGES ON DATABASE db1 TO u1;
GRANT ALL PRIVILEGES ON all tables in schema test1 TO u1:
修改连接:
\c db1 u1; #以用户u1连接到db1数据库;
\password
传统的创建语句:
create role u1 login password‘123456’;
注意:
role:在MySQL和Oracle中是“角色”,用于权限和组合;在PolarDB中是“用户”。