目录
一、基本架构
0、数据模型
1、主从集群
2、分库分表
二、部署安装
1、配置要求
2、前置依赖
3、安装步骤
三、基本操作
1、实例启停
2、命令执行
3、基本查询
4、表空间管理
4、用户管理
6、数据库操作
7、SCHEMA操作
8、表操作
9、日志操作
(1)开启归档
(2)相关查询
(3)清理归档
(4)重置归档
一、基本架构
第一印象,SeaboxSQL数据库是基于 PostgreSQL 做的。看介绍是有一些自己的东西,但因为我只涉及到数据的灾备(备份恢复),所以关注点只在数据库的安装,基本使用和灾备。说个好玩的,在技术预研过程中,遇到一些问题,你直接按 SeaboxSQL 搜索结果寥寥,但按照 PG 去搜索,反而能够得到答案(会心一笑)。
SeaboxSQL提供丰富的企业级功能,在性能、安全性、Oracle兼容性、高可用性、易用性等方面均有较多技术特点和优势,支持HA、读写分离、共享存储集群部署架构。同时提供了针对数据分析场景的列存储引擎与向量执行引擎,极大提升在事务和分析混合业务领域的适用范围。
0、数据模型
表空间是一个逻辑结构,用于定义数据库对象(如表、索引等)的物理存储位置,每个表空间对应文件系统上的一个目录。表空间帮助分隔存储,优化性能,或将数据存储在不同的磁盘上。表空间在实例级别上创建,并且可以被该实例中的所有数据库共享。数据库初始化之后自动会创建 pg_default 和 pg_global 两个表空间。
数据库是 PostgreSQL 中的一个逻辑容器,包含了表、索引、视图、序列等所有数据对象。新建一个数据库会在表空间对应的目录下创建一个 oid( 数据库 oid )的目录;用于存放这个数据库对应的数据库文件。PG 同实例下数据库之间不仅物理结构完全独立,逻辑结构也是完全独立。每个 database 创建时;会默认为库创建 pg_catalog / information_schema。
实例是运行 PostgreSQL 数据库管理系统的一个进程。一个 PostgreSQL 实例可以管理一个或多个数据库。
用户是 PostgreSQL 系统中的一个实体,具有权限和角色。用户可以操作数据库对象、管理数据库和表空间等。
1、主从集群
SeaboxSQL 内置基于 WAL 日志流复制( Stream replication )机制的主备集群解决方案。
以典型的双机热备高可用场景为例,两台 SeaboxSQL 服务器分别作为主从数据库服务器同时运行,并通过主从机间的 “ 心跳 ” 通讯监测彼此的运行状态。正常情况下,主服务器对外提供数据库服务,另一台处于备用状态。一旦主服务器发生故障不能提供数据库服务时,从服务器主动接管,并继续对外提供服务,保证用户不间断的数据库访问。故障服务器修复后处于备用状态。
SeaboxSQL 主备集群高可用架构支持读写分离的负载隔离机制,对于大量读取少量更新的应用,可按参数设定讲读取负载分发到备服务执行,可有效提升数据库系统的吞吐量。
2、分库分表
SeaboxSQL 数据库支持借助开源中间件 ShardingSphere 构建分库分表集群的高可用方案,具有分库、分表、分布式事务、弹性伸缩、读写分离等众多能力;保证高可用场景,同时可实现负载均衡。
ShardingSphere-Proxy 是 ShardingSphere 生态中的一个接入端,即对客户端透明的数据库代理,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。因此客户端代码无需配置修改,应用程序完全透明,可直接当做 SeaboxSQL 使用,适用于任何客户端。
HAProxy 结合 seabox monitor 组件,可以始终识别数据库的主节点,保证高可用场景,同时可实现负载均衡;
每个 SeaboxSQL 高可用节点支持一主多备,每个节点使用 SCDCS 一致性协议保证数据的一致性,各个节点可以部署在相同或不同的区域,用以保证多地多中心的数据安全。
二、部署安装
集群部署可参考官方文件,下面只介绍单机环境的部署。
1、配置要求
CPU 平台
通用 X86_64CPU 平台
鲲鹏 916/920 CPU 平台
飞腾 1500 及以上型号 CPU 平台
龙芯 3B CPU 平台
操作系统
RHEL 7 及以上版本
CentOS 7 及以上版本
UOS 20 统一操作系统
银河麒麟 V4
中标麒麟 V7
最低配置要求
最小 CPU : 任意兼容 x86_64 框架的 CPU 鲲鹏、飞腾等 ARM 架构 CPU
最小内存 : 单个主机 16GB RAM
磁盘空间要求 SeaboxSQL 数据库安装的程序需每节点 150MB 存储空间
每个实例需约 300MB 元数据存储空间
存储数据的磁盘需保留合理的空闲空间,通常存储的数据不超过整体磁盘空间 70%
数据库高可用集群部署建议内部万兆网络连接
服务有多个网口时建议使用多网卡绑定
2、前置依赖
依赖如下:
apr、openldap、apr-util、openssh、bash、openssl、bzip2、openssl-libs、curl、perl、
krb5、readline、libcurl、rsync、libevent、sed、libxml2、tar、libyaml、zip、zlib
先使用 yum list installed 查询已安装程序是否满足上述需求,若不满足,则配置 yum 源后进行安装。
[root@localhost mnt]# mkdir iso
[root@localhost mnt]# mount -o loop /mnt/Kylin-Server-V10-SP3-2403-Release-20240426-arm64.iso /mnt/iso/
mount: /mnt/iso: WARNING: source write-protected, mounted read-only.
[root@localhost mnt]# rm /etc/yum.repos.d/kylin_aarch64.repo
rm:是否删除普通文件 '/etc/yum.repos.d/kylin_aarch64.repo'?y
[root@localhost mnt]# vim /etc/yum.repos.d/local.repo
[root@localhost mnt]# cat /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/iso
gpgcheck=0
enabled=1
[root@localhost mnt]# yum clean all
0 files removed
[root@localhost mnt]# yum makecache
local 277 MB/s | 3.9 MB 00:00
Last metadata expiration check: 0:00:01 ago on 2024年08月20日 星期二 16时34分09秒.
Metadata cache created.
若遇到所需动态库版本与已安装版本不一致的问题,可以直接拷贝已安装的并重命名为指定版本。举例如下:
[seaboxsql@localhost ~]$ ssql seaboxsql -p 7300
ssql: error while loading shared libraries: libreadline.so.7: cannot open shared object file: No such file or directory
[root@localhost ~]# cp /lib64/libreadline.so.8.0 /lib64/libreadline.so.7
[seaboxsql@localhost ~]$ ssql seaboxsql -p 7300
ssql (21.2.2.203)
Type "help" for help.
3、安装步骤
按如下步骤依次安装:
# 最好创建专属用户
useradd -r -m seaboxsql
# 切换安装用户
su - seaboxsql
# 上传安装包后进行解压
unzip seaboxsql-db-11.5-rhel7-x86_64.zip
# 计算 md5 校验和,并与 seaboxsql-db-11.5-KYLINV10-aarch64.md5 内容进行比较
md5sum seaboxsql-db-11.5-rhel7-x86_64.bin
# 安装过程中默认都是 yes,安装目录为 /usr/local/seabox,若需修改,则需要输入绝对路径
./seaboxsql-db-11.5-rhel7-x86_64.bin
# 设置环境变量
vim ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/seabox/seaboxsql-db/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/seabox/seaboxsql-db/bin:$PATH
# 必须在环境变量中添加下面命令,
# 每次进入用户环境后,先 source 一下环境变量,不然很多工具运行报错“核心已转储”,可以运行 seaboxsql --version 进行测试
source /usr/local/seabox/seaboxsql-db-21.2.2.203/seaboxsql_path.sh
source ~/.bashrc
# 初始化数据库
cd /usr/local/seabox/seaboxsql-db
mkdir data
initdb -D /usr/local/seabox/seaboxsql-db/data/
# 启动服务(可以创建一个启动脚本)
[seaboxsql@localhost ~]$ cat sbs_start.sh
sd_ctl start -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
# 关闭服务
[seaboxsql@localhost ~]$ cat sbs_stop.sh
kill -INT `head -1 /usr/local/seabox/seaboxsql-db-21.2.2.203/data/seaboxmaster.pid`
# 调整数据库配置
vim /usr/local/seabox/seaboxsql-db/data/seaboxsql.conf
listen_addresses = '*'
port=7300
vim /usr/local/seabox/seaboxsql-db/data/sd_hba.conf
# 添加数据库访问配置
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
使用 ssql 中登录终端,若报如下错误:
若本地不存在 libreadline,则可以使用 yum 在配置本地源后下载 readline。若已安装但存在版本不一致的问题,可以采用下面的方法进行调整。
cp /lib64/libreadline.so.8.0 /lib64/libreadline.so.7
三、基本操作
1、实例启停
# 开启
sd_ctl start -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
# 关闭(两种方法,推荐方法 1)
sd_ctl stop -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
kill -INT `head -1 /usr/local/seabox/seaboxsql-db-21.2.2.203/data/seaboxmaster.pid`
# 重启
sd_ctl restart -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
# 查看状态
sd_ctl status -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
# 具体的参考 sd_ctl 参数说明
sd_ctl --help
2、命令执行
# 登录终端工具(用户名、端口)
ssql -h 127.0.0.1 -p 7300 -U unary -d seaboxsql -w
# 添加密钥文件,在需要密码验证时会读取该文件
[seaboxsql@localhost ~]$ vim ~/.sdpass
[seaboxsql@localhost ~]$ chmod 0600 ~/.sdpass
# 按照格式 IP:Port:Database:username:password
[seaboxsql@localhost ~]$ cat ~/.sdpass
127.0.0.1:7300:seaboxsql:unary:111111
# 执行 sql 脚本,执行表相关操作时,需要关注指定表所属 schema。
ssql db1 -p 7300 -Uunary -f /home/seaboxsql/insert.sql
ssql db1 -p 7300 -Uunary < /home/seaboxsql/insert.sql
echo 'select count(*) from employees;' | ssql -h 127.0.0.1 -p 7300 -U unary -d db1
3、基本查询
# 查看实例版本
select version();
# 查看数据库时区
show timezone;
# 查看当前时间戳
select now();
# 查看数据目录
SHOW data_directory;
4、表空间管理
# 创建表空间
CREATE TABLESPACE ts_unary LOCATION '/usr/local/seabox/seaboxsql-db/data/ts_unary';
# 查询表空间, 数据库安装后默认两个 pg_default、pg_global
\db
select * from pg_tablespace;
# 查询表空间 oid 和对应的存储路径
SELECT oid, spcname, pg_tablespace_location(oid) AS location FROM pg_tablespace;
4、用户管理
# 创建超级用户
CREATE USER unary WITH SUPERUSER ENCRYPTED PASSWORD '111111';
# 创建用户
CREATE USER unary WITH ENCRYPTED PASSWORD '111111';
# 修改用户密码
ALTER USER name WITH ENCRYPTED PASSWORD 'password'
# 创建角色
CREATE ROLE name WITH LOGIN ENCRYPTED PASSWORD 'password'
# 修改角色密码
ALTER ROLE name WITH ENCRYPTED PASSWORD 'password'
# 查看当前用户名
select user;
select current_user;
# 查看session用户
select session_user;
# 以账户密码登录,-W 启动用户密码强认证
[seaboxsql@localhost ~]$ ssql seaboxsql -p 7300 -Uunary -W
Password:
ssql (21.2.2.203)
6、数据库操作
# 查询各个数据库的 OID
select oid, datname from pg_database;
# 查看当前实例有哪些数据库
\l
# 创建数据库
CREATE DATABASE db1 OWNER unary TEMPLATE template0 ENCODING 'UTF8' TABLESPACE pg_default;
# 切换数据库,需要输入所属用户的密码
\c dbname
# 查看数据库大小
select pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_database;
# 删除数据库,需切换到 seaboxsql 数据库
\c seaboxsql
drop database db1;
7、SCHEMA操作
# 创建 SCHEMA
CREATE SCHEMA bench;
# 查看当前SCHEMA
SELECT current_schema();
# 设置搜索路径
ALTER DATABASE db1 SET search_path TO bench,
public, pg_catalog;
ALTER ROLE sally SET search_path TO myschema, public,
pg_catalog;
# 查看当前搜索路径
SHOW search_path;
# 删除SCHEMA(SCHEMA 内为空)
DROP SCHEMA myschema;
# 若要删除 SCHEMA 及其内部所属
DROP SCHEMA myschema CASCADE;
要在数据库中指定一个对象的位置,请使用 schema 限定的名称。例如:SELECT * FROM myschema.mytable; 用户可以设置 search_path 配置参数来指定在其中搜索对象的可用 schema 的顺序。在该搜索路径中第一个列出的方案会成为默认 schema 。如果没有指定方案,对象会被创建在默认 schema 中。
数据库内系统级 SCHEMA:
pg_catalog 包含着系统目录表、内建数据类型、函数和操作符。即便在 schema 搜索路径中没有显式地提到它,它也总是 schema 搜索路径的一部分。
information_schema 有一个包含数据库中对象信息的视图集合组成。这些视图以一种标准化的方式从系统目录表中得到系统信息。
pg_toast 存储大型对象,如超过页面尺寸的记录。这个 schema 由 SeaboxMPP 数据库系统内部使用。
pg_bitmapindex 存储位图索引对象,例如值的列表。这个 schema 由 SeaboxMPP 数据库系统内部使用。
pg_aoseg 存储列存表对象。这个 schema 由 SeaboxMPP 数据库系统内部使用。
sc_toolkit 是一个管理用途的 schema ,它包含用户可以用 SQL 命令访问的外部表、视图和函数。所有的数据库用户都能访问 sc_toolkit 来查看和查询系统日志文件以及其他系统指标
8、表操作
# 查看表结构
\d table
# 查看详细的表结构
\d+ table
# 查看表的数量
SELECT COUNT(*) FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema';
# 创建表(所属于当前 SCHEMA )
CREATE TABLE employees ( employee_id SERIAL, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, hire_date DATE, department_id INT );
insert into public.employees values(101, 'tom', 'cat', '1996-12-08 10:30:40', 66);
# 删除表
drop table employees;
9、日志操作
(1)开启归档
创建归档日志目录,可以直接切换到数据库系统用户后进行创建,可以避免权限问题。
# 编辑数据目录下的配置文件
vim /usr/local/seabox/seaboxsql-db/data/seaboxsql.conf
# 调整文件内如下内容
# minimal, replica, or logical
wal_level = replica
# enables archiving; off, on, or always (change requires restart)
archive_mode = on
# command to use to archive a logfile segment
archive_command = 'test ! -f /usr/local/seabox/seaboxsql-db/archive_log/%f && cp %p /usr/local/seabox/seaboxsql-db/archive_log/%f'
# max number of walsender processes
max_wal_senders = 10
# 配置监听
# what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
listen_addresses = '*'
port = 7300
配置文件修改完成后重启数据库。
[seaboxsql@localhost ~]$ sd_ctl stop -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
waiting for server to shut down, checkpoint maybe take few minutes, please wait patiently.... done
server stopped
[seaboxsql@localhost ~]$ sd_ctl status -D /usr/local/seabox/seaboxsql-db/data/
sd_ctl: no server running
[seaboxsql@localhost ~]$ sd_ctl start -l /usr/local/seabox/seaboxsql-db/log/run.log -D /usr/local/seabox/seaboxsql-db/data
waiting for server to start.... done
server started
[seaboxsql@localhost ~]$ sd_ctl status -D /usr/local/seabox/seaboxsql-db/data/
sd_ctl: server is running (PID: 474398)
/usr/local/seabox/seaboxsql-db-21.2.2.203/bin/seaboxsql "-D" "/usr/local/seabox/seaboxsql-db/data"
重启后,查看归档模式是否开启。
# 查看归模式
seaboxsql=# show archive_mode;
archive_mode
--------------
on
(1 row)
(2)相关查询
# 查看当前正在写的WAL文件
select pg_xlogfile_name(pg_current_xlog_location());
# 查看当前WAL的buffer中还有多少字节的数据没有写到磁盘中
select pg_xlog_location_diff(pg_current_xlog_insert_location(),pg_current_xlog_location());
# 查看归模式
show archive_mode;
# 查看归档配置
show archive_command
# 查看日志级别
show wal_level;
# 查询当前日志LSN
select pg_current_wal_lsn()
# 根据 LSN 查询对应的归档日志文件
select pg_walfile_name('0/8001128');
(3)清理归档
# 查询当前日志 LSN
seaboxsql=# SELECT pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/8001128
(1 row)
# 查询 LSN 对应的日志文件
seaboxsql=# select pg_walfile_name('0/8001128');
pg_walfile_name
--------------------------
000000010000000000000008
(1 row)
# 清理 000000010000000000000008 之前的所有归档日志文件
[seaboxsql@localhost backup]$ sd_archivecleanup /usr/local/seabox/seaboxsql-db/archive_log/ 000000010000000000000008
(4)重置归档
用于重置数据库的 WAL(Write-Ahead Logging)日志。它常用于在数据目录损坏或 WAL 文件丢失的情况下恢复数据库。
运行 pg_resetwal 会清除并重新创建 WAL 文件,从而使数据库能够启动并运行,但要注意,它可能会导致丢失 WAL 记录的信息,影响到数据的恢复一致性。因此,它通常作为最后的手段,在尝试其他恢复方法失败后使用。
[seaboxsql@localhost ~]$ sd_resetwal -f /usr/local/seabox/seaboxsql-db/data
Write-ahead log reset