暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB基础系列--创建和管理数据库

由迪 2024-02-04
652

MogDB基础系列–创建和管理数据库

原作者:杨有田

1.数据库逻辑结构介绍

​ 上一篇文章,我们介绍了表空间,现在学习如何管理数据库这个“对象”。大家都知道,实例(内存和进程)和数据库有一定的对应关系,oracle(非RAC)是一对一,一个实例对应一个数据库;而MogDB是一对多,每个实例管理一个或多个数据库。下面是简要介绍:

1)数据库是模式的集合, 而模式包含表、函数等等。

2)每个实例管理一个或多个数据库。

3)每个数据库的数据可以存放到多个表空间。

4)每个表空间可以存储多个数据库的数据。

5)表空间可以简单理解为操作系统的目录。

6)Datafile Segment,即数据文件,通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储。

7)数据库系统中会有多个数据库,但是客户端程序一次只能连接一个数据库。也不能在不同的数据库之间相互查询

8)block,默认8k

img

2.创建数据库有哪些注意点

MogDB初始化默认包含3个数据库,分别是两个模板数据库template0和template1,以及一个默认用户数据库postgres。对于模板数据库,避免使用客户端或其他手段连接及操作。

我们先来看看创建数据库命令create database有哪些选项和系统表PG_DATABASE有哪些字段,从这里来了解创建数据库需要关注的地方。

–命令create database

MogDB=# \h create database
Command:     CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE database_name
    [ [ WITH ] {[ OWNER [=] user_name ]|
           [ TEMPLATE [=] template ]|
           [ ENCODING [=] encoding ]|
           [ LC_COLLATE [=] lc_collate ]|
           [ LC_CTYPE [=] lc_ctype ]|
           [ DBCOMPATIBILITY [=] compatibility_type ]|
           [ TABLESPACE [=] tablespace_name ]|
           [ CONNECTION LIMIT [=] connlimit ]}[...] ];

MogDB=#
--系统表pg_database

从这两个地方可以看到,需要重点关注的点有,数据库owner、字符集编码(ENCODING)和兼容性(DBCOMPATIBILITY)等配置项。默认字符集编码为UTF-8;兼容性,A、B、PG,分别表示兼容Oracle、MySQL和PostgreSQL的语法,不同兼容模式下的语法行为存在一定差异,默认的兼容数据库类型为O(即DBCOMPATIBILITY = A )。

MogDB=# \l+
                                                                       List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges | Compatibility | Size  | Tablespace |                Description                 
-----------+-------+----------+-------------+-------------+-------------------+---------------+-------+------------+--------------------------------------------
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A             | 13 MB | pg_default | default administrative connection database
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A             | 13 MB | pg_default | default template for new databases
           |       |          |             |             | omm=CTc/omm       |               |       |            | 
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A             | 13 MB | pg_default | unmodifiable empty database
           |       |          |             |             | omm=CTc/omm       |               |       |            | 
(3 rows)

MogDB=# \db+
                               List of tablespaces
    Name    | Owner |         Location          | Access privileges | Description 
------------+-------+---------------------------+-------------------+-------------
 pg_default | omm   |                           |                   | 
 pg_global  | omm   |                           |                   | 
 tsd_leo01  | omm   | /opt/mogdb/data/tsd_leo01 |                   | 
 tsd_leo02  | omm   | /opt/mogdb/data/tsd_leo02 |                   | 
(4 rows)

CREATE DATABASE实际上通过拷贝模板数据库来创建新数据库。支持拷贝template0,如果使用template1提示报错不支持。

MogDB=# create database leo02 template template1;      
ERROR:  template1 is not supported for using here, just support template0
MogDB=# create database leo02 template template0 tablespace tsd_leo02;
CREATE DATABASE
MogDB=# create database leo01 tablespace tsd_leo01 encoding='UTF-8' dbcompatibility='B';
CREATE DATABASE
MogDB=# \l+
                                                                       List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges | Compatibility | Size  | Tablespace |                Description                 
-----------+-------+----------+-------------+-------------+-------------------+---------------+-------+------------+--------------------------------------------
 leo01     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | B             | 13 MB | tsd_leo01  | 
 leo02     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A             | 13 MB | tsd_leo02  | 
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A             | 13 MB | pg_default | default administrative connection database
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A             | 13 MB | pg_default | default template for new databases
           |       |          |             |             | omm=CTc/omm       |               |       |            | 
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A             | 13 MB | pg_default | unmodifiable empty database
           |       |          |             |             | omm=CTc/omm       |               |       |            | 
(5 rows)

MogDB=# select * from pg_database where datname like 'leo%';
 datname | datdba | encoding | datcollate  |  datctype   | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility | datac
l | datfrozenxid64 | datminmxid 
---------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+------
--+----------------+------------
 leo02   |     10 |        7 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         15935 | 13017        |         16403 | A                |      
  |          13017 |          2
 leo01   |     10 |        7 | en_US.UTF-8 | en_US.UTF-8 | f             | t            |           -1 |         15935 | 13017        |         16389 | B                |      
  |          13017 |          2
(2 rows)

MogDB=# select datname,encoding,pg_encoding_to_char(encoding) from pg_database;
  datname  | encoding | pg_encoding_to_char 
-----------+----------+---------------------
 template1 |        7 | UTF8
 template0 |        7 | UTF8
 leo02     |        7 | UTF8
 postgres  |        7 | UTF8
 leo01     |        7 | UTF8
(5 rows)

进入表空间tsd_leo01目录,可以看到create database的时候,自动创建了大量系统对象。

[omm@mogdb01 tsd_leo01]$ pwd
/opt/mogdb/data/tsd_leo01
[omm@mogdb01 tsd_leo01]$ cd PG_9.2_201611171_dn_6001_6002/pgsql_tmp/
[omm@mogdb01 pgsql_tmp]$ cd …
[omm@mogdb01 PG_9.2_201611171_dn_6001_6002]$ ls
pgsql_tmp
[omm@mogdb01 PG_9.2_201611171_dn_6001_6002]$ cd 16435/
[omm@mogdb01 16435]$ ls
15354 15392 15429 15465 15494 15519 15543 15571 15624_fsm 15648 15709 15758 15796 15833 15886 15913_vm
15354_fsm 15394 15430 15466 15495 15519_fsm 15543_fsm 15572 15624_vm 15649 15710 15759 15798 15834 15887 15915
15354_vm 15395 15432 15467 15496 15519_vm 15543_vm 15573 15626 15650 15712 15760 15799 15835 15888 15917
15356 15396 15434 15468 15497 15521 15545 15573_fsm 15627 15652 15713 15761 15801 15840 15889 15918
15357 15398 15435 15468_fsm 15498 15522 15545_fsm 15573_vm 15628 15654 15714 15763 15803 15842 15891 15918_fsm
15358 15400 15437 15468_vm 15499 15523 15545_vm 15575 15628_fsm 15655 15716 15765 15804 15843 15892 15918_vm
15360 15401 15439 15470 15501 15523_fsm 15547 15576 15628_vm 15680 15717 15766 15805 15844 15893 15920
15365 15403 15440 15471 15502 15523_vm 15548 15577 15630 15682 15718 15769 15806 15846 15893_fsm 15922
15365_fsm 15405 15445 15472 15503 15525 15549 15577_fsm 15631 15683 15719 15771 15808 15847 15893_vm 15923
15365_vm 15406 15447 15473 15503_fsm 15526 15550 15577_vm 15632 15685 15721 15772 15809 15860 15895 15925
15367 15408 15448 15475 15503_vm 15527 15552 15579 15632_fsm 15687 15722 15773 15810 15862 15897 15927
15367_fsm 15410 15448_fsm 15477 15505 15528 15554 15580 15632_vm 15688 15724 15775 15811 15863 15898 15928
15367_vm 15411 15448_vm 15478 15506 15528_fsm 15555 15581 15634 15689 15725 15776 15812 15864 15898_fsm 15930
15369 15411_init 15450 15479 15507 15528_vm 15556 15582 15635 15690 15726 15777 15813 15866 15898_vm 15932
15370 15413 15451 15480 15507_fsm 15530 15557 15582_fsm 15636 15692 15728 15778 15814 15867 15900 15933
15371 15413_init 15452 15481 15507_vm 15531 15558 15582_vm 15636_fsm 15693 15729 15779 15816 15868 15902 15934
15373 15415 15452_fsm 15482 15509 15532 15558_fsm 15584 15636_vm 15694 15734 15780 15817 15870 15903 pg_filenode.map
15375 15415_init 15452_vm 15483 15510 15532_fsm 15558_vm 15585 15638 15696 15736 15781 15818 15871 15903_fsm pg_filenode.map.backup
15376 15416 15454 15483_fsm 15511 15532_vm 15560 15617 15639 15698 15741 15782 15819 15872 15903_vm pg_internal.init.92605
15377 15416_init 15454_fsm 15483_vm 15511_fsm 15534 15562 15617_fsm 15640 15699 15743 15784 15821 15874 15905 PG_VERSION
15379 15417 15454_vm 15485 15511_vm 15535 15563 15617_vm 15642 15703 15744 15785 15822 15875 15907
15381 15419 15456 15487 15513 15536 15564 15619 15642_fsm 15703_fsm 15746 15786 15823 15876 15908
15382 15421 15457 15488 15514 15538 15564_fsm 15620 15642_vm 15703_vm 15747 15788 15824 15878 15908_fsm
15384 15422 15458 15489 15515 15539 15564_vm 15621 15644 15705 15750 15789 15826 15879 15908_vm
15386 15424 15459 15490 15515_fsm 15539_fsm 15566 15621_fsm 15645 15706 15752 15791 15827 15880 15910
15387 15426 15460 15490_fsm 15515_vm 15539_vm 15567 15621_vm 15646 15707 15753 15792 15828 15882 15912
15389 15427 15461 15490_vm 15517 15541 15568 15623 15646_fsm 15707_fsm 15754 15794 15830 15883 15913
15391 15428 15463 15492 15518 15542 15570 15624 15646_vm 15707_vm 15756 15795 15831 15884 15913_fsm
[omm@mogdb01 16435]$

MogDB=# select oid,relname,relowner,relfilenode,relkind,reltablespace,relnamespace from pg_class where relfilenode=15932;
oid | relname | relowner | relfilenode | relkind | reltablespace | relnamespace
-------±---------------------±---------±------------±--------±--------------±-------------
15317 | pg_toast_15310_index | 10 | 15932 | i | 0 | 99
(1 row)

进一步连接数据库leo01,创建表tab1和tab2,分别指定不同表空间tsd_leo01和tsd_leo02,其中tsd_leo01为数据库leo01的默认表空间,可以看到pg_class.reltablespace显示默认表空间为0而不是16389。

MogDB=# \c leo01
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database “leo01” as user “omm”.
leo01=# create table tab1(i number);
CREATE TABLE
leo01=# select oid,relname,relowner,relfilenode,relkind,reltablespace,relnamespace from pg_class where relname=‘tab1’;
oid | relname | relowner | relfilenode | relkind | reltablespace | relnamespace
-------±--------±---------±------------±--------±--------------±-------------
16436 | tab1 | 10 | 16436 | r | 0 | 2200
(1 row)

leo01=# create table tab2(i number) tablespace tsd_leo02;
CREATE TABLE
leo01=# select oid,spcname from pg_tablespace;
oid | spcname
-------±-----------
1663 | pg_default
1664 | pg_global
16389 | tsd_leo01
16403 | tsd_leo02
(4 rows)

leo01=# select oid,relname,relowner,relfilenode,relkind,reltablespace,relnamespace from pg_class where relname=‘tab2’;
oid | relname | relowner | relfilenode | relkind | reltablespace | relnamespace
-------±--------±---------±------------±--------±--------------±-------------
16442 | tab2 | 10 | 16442 | r | 16403 | 2200
(1 row)

leo01=#

对比兼容性MySQL和Oracle,‘’和null处理逻辑不一样:

MogDB=# \c leo01
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "leo01" as user "omm".
leo01=# create table tab_leo01(id int,name char(10)) tablespace tsd_leo01 distribute by hash(id);
ERROR:  Un-support feature
DETAIL:  The distributed capability is not supported currently.
leo01=# \q
[omm@mogdb01 ~]$ g
gsql ((MogDB 3.0.4 build cc068866) compiled at 2023-03-03 17:47:05 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=# \c leo01
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "leo01" as user "omm".
leo01=# create table tab_leo01(id int,name char(10)) tablespace tsd_leo01;
CREATE TABLE
leo01=# insert into tab_leo01 values(1,'enmo'),(2,''),(3,'pgdatabase'),(4,''),(5,'');
INSERT 0 5
leo01=# insert into tab_leo01 values(1,'enmo'),(2,''),(3,'pgdatabase'),(4,''),(5,'');
INSERT 0 5
leo01=# select * from tab_leo01 where name is null;
 id | name 
----+------
(0 rows)

leo01=# select * from tab_leo01 where name='';
 id |    name    
----+------------
  2 |           
  4 |           
  5 |           
  2 |           
  4 |           
  5 |           
(6 rows)

leo01=# \c leo02
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "leo02" as user "omm".
leo02=# insert into tab_leo02 values(1,'enmo'),(2,''),(3,'pgdatabase'),(4,''),(5,'');
ERROR:  relation "tab_leo02" does not exist on dn_6001_6002
LINE 1: insert into tab_leo02 values(1,'enmo'),(2,''),(3,'pgdatabase...
                    ^
leo02=# create table tab_leo02(id int,name char(10)) tablespace tsd_leo02;
CREATE TABLE
leo02=# insert into tab_leo02 values(1,'enmo'),(2,''),(3,'pgdatabase'),(4,''),(5,'');
INSERT 0 5
leo02=# insert into tab_leo02 values(1,'enmo'),(2,''),(3,'pgdatabase'),(4,''),(5,'');
INSERT 0 5
leo02=# select * from tab_leo02 where name is null;
 id | name 
----+------
  2 | 
  4 | 
  5 | 
  2 | 
  4 | 
  5 | 
(6 rows)

leo02=# select * from tab_leo02 where name='';
 id | name 
----+------
(0 rows)

leo02=# 

3.其他管理操作

3.1 查看数据库

查看数据库的属性,比如:owner、名称、字符集编码、兼容性等等,可以通过两种方式查看,元命令\l和视图pg_database。

3.2 修改数据库

可以修改数据库的名字、owner、默认表空间、配置参数等等,下面测试下修改数据库的owner:

MogDB=# \h alter database
Command:     ALTER DATABASE
Description: change a database
Syntax:
ALTER DATABASE database_name
    [ [ WITH ] CONNECTION LIMIT connlimit ];
ALTER DATABASE database_name
    RENAME TO new_name;
ALTER DATABASE database_name
    OWNER TO new_owner;
ALTER DATABASE database_name
    SET TABLESPACE new_tablespace;
ALTER DATABASE database_name
    SET configuration_parameter { { TO | = } { value | DEFAULT }  | FROM CURRENT };
ALTER DATABASE database_name
    RESET { configuration_parameter | ALL };
ALTER DATABASE database_name
    [ WITH ] { ENABLE | DISABLE } PRIVATE OBJECT;

MogDB=# \l
                                      List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges | Compatibility 
-----------+-------+----------+-------------+-------------+-------------------+---------------
 leo01     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | B
 leo02     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
(5 rows)

MogDB=# alter database leo01 owner to leo;
ALTER DATABASE
MogDB=# \l
                                      List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges | Compatibility 
-----------+-------+----------+-------------+-------------+-------------------+---------------
 leo01     | leo   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | B
 leo02     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
(5 rows)

3.3 删除数据库

使用DROP DATABASE命令删除数据库。这个命令删除了数据库中的系统目录,并且删除了带有数据的磁盘上的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。

MogDB=# \l
                                      List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges | Compatibility 
-----------+-------+----------+-------------+-------------+-------------------+---------------
 leo01_u   | leo   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | B
 leo02     | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 postgres  | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | A
 template0 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
 template1 | omm   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/omm           +| A
           |       |          |             |             | omm=CTc/omm       | 
(5 rows)

MogDB=# drop database leo02;
DROP DATABASE
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论