读写并发
写会将上一个版本 记录到UNDO区域
查询不加锁 通过读undo获取可见版本
行锁不阻塞读 只阻塞其他事务 对改行的修改
DML并发
DML对表加共享锁
修改一行数据前 对行加锁 阻塞其他事务对这行进行修改
已经对改行加锁的事务未提交之前 其他要修改的该行的事务只能等待事务提交
DML 结束时候 不释放锁和行锁 提交的时候放表锁和行锁
DML 并发
DML对表加共享锁
修改一行数据前,对行加锁 阻塞其他事务对这行进行修改
已经对该行加锁的事务未提交前 其他要修改该行的事务 只能等待 事务提交
DML结束时候不释放 表锁和行锁 提交的时候放表锁和行锁
MVCC
多版本并发控制 提供受控的高度并发的数据访问
并发访问控制 是数据库提供的一系列功能 允许许多人 同时访问 和修改数据
多版本值GaussDB 同时物化多个版本的数据 使得读写相互不阻塞 默认情况下 多版本的一致性是语句级的
回滚管理段
事务修改数据之前 先将原始数据保存在回滚段
回滚段作用:
1、用户回滚事务 或者事务执行失败 将数据恢复到事务执行前
2、读写一致 在读写并发场景下 写事务将原始数据保存到回滚段中 读事务就可去回滚段读取他的可见版本 保证数据一致性
3、闪回查询 用户可以查询过去某个时刻数据
4、数据库恢复 数据库实例重启后 先利用redo日志对数据进行恢复 恢复之后再利用回滚段 将重启前未提交的事务 回滚
5、回滚段复用 回滚消息有效期 过期的回滚段数据可以被复用
6、回滚段有效期配置
多版本管理
保持数据一致性 提高数据读写性
历史版本和当前版本分离存储
数据页面只保留最新版本 历史版本在回滚段中存储
事务表和回滚段循环使用
元组头部 只保留ITL ID 由ITL存储当前操作页面的事务信息
可见性判断 通过获取当前系统SCN 比较SCN 的值判断可见性
回滚段空间自动回收复用
行级MVCC
每行数据 都记录回滚地址
同一行数据的undo 信息构成一个链
获取历史版本需要回滚 一行数据可见版本
数据占用空间大
页级MVCC
每个事务记录回滚地址值段
同一个事务的undo 信息构成一个链
数据占用空间小
需要配置 CR POOL参数调优
快照太旧
回滚段复用
undo空间不足
长查询
事务复用
事务数量有限 事务槽位循环使用
事务发生延期清理 不清理页面itl信息 再次访问页面 事务已被复用 无法获取事务的准时提交时间 导致无法判断版本是否可见
解决策略
增大undo表空间
增加undo保留空间
增加事务数量
锁管理
表锁管理
表锁控制发生在表级DML和DDL的并发
DML操作会加表级别的共享锁来防止并发的DDL操作 查询不加锁
DDL会加表级的排他锁 阻塞其他DDL
表锁模式
share 共享锁 最低级的表锁 允许并发进行DML 但不能并发进行DDL
Exclusiive 排他锁 最高级别的限制 获取X锁后 不允许其他事务在该表上 进行任何DDL 和DML 写
IX 意向排他锁 在表已经有共享锁的情况下 DDL想加排他锁 会先加意向锁 并阻止后续有共享锁加入 防止DDL一直拿不到锁 属于等待过程 并非已经加上锁
行锁管理
行锁是由DML操作引起的
行锁只有排他锁一种种类 没有共享锁
行锁在page上 将要锁的行关联到一个事务上 如果其他事务 要修改一行 看到这行已经关联到一个事务 就会进入等待 直到修改的事务提交或者等待超时
行锁等待时间可以通过配置参数配置 LOCK_TIMEOUT
死锁检查
session1 等待session2 session2等待session1
表锁死锁 session1 给A一个排他锁 session2 给B表一个排他锁 session1 给B表加排他锁 进行等待session2 ,session2 给A表一个排他锁 进入等待session1
事务死锁 行锁死锁 -> 事务1修改rowA 未交, 事务2修改RowB 未提交, 事务1修改rowB 进入事务等待 等待事务2提交 ,事务2修改rowA 进入事务等待 等待事务1提交
ITL死锁 修改page
监测 : GaussDb会自动监测死锁 并在语句级进行死锁的回滚
发生死锁 会将死锁打印在运行日志里
监测出死锁 并在其中一个session 提出死锁错误 打破死锁等待
数据库安全管理
网络安全 系统安全 数据安全【广义上可以分为这三个层次】
网络:从技术上讲 网络系统层次安全技术方面 主要由加密技术 防火墙技术 入侵检测技术等
系统:核心是要保障服务器安全,主要体现在服务器账户 口令访问权限等
数据管理:数据库加密 数据存取审计 安全审计 数据备份
安全:通过访问控制 和SSL 防止客户端仿冒 信息泄露以及交互信息串改
通过用户权限 对数据库服务器 加固 防止权限提升风险
通过安全审计 对数据库所有操作 有据可查
LSNR_ADDR 地址 LSNR_PORT 端口
SESSIONS 默认值200 由预留的系统用户session merge用户session 普通用户session组成
系统用户包括:固定的32个session 用于内部使用会话 资源回收 checkpoint等 固定预留的16个session 用于sql并行框架会话
emerg用户包括: Super_user_reserved_session 参数控制
普通用户包括: session-32-16 至少配置一个 ,否则数据库无法启动
session取值建议配置 optimized_worker_threads*1.2
super_user_reserved_sessions: 预留给sys session个数 默认值5
optimized_worker_threads 最优工作线程个数 默认100
客户端连接方法 :
按口令分类 口令认证登录 、本地免密登录
按登录协议分类:tcp 或 UDS(本地登录 一般作为业务管理通道)
TCP连接
管理员登录[仅只有管理员可以免密登录] zsql / as SYSDBA [ip:port] -d /home/omm/data1 如果启了多个数据库实例,需要使用-d 指定数据库目录
普通用户登录 zsql user/userpassword@ip:port [-d /home/omm/data1] -q -w connect_timeout -s silent_log
当数据库管理员 管理多个实例的时候 连接制定的实例需要指定-d 数据目录 、-q 取消ssl登录认证 、-s 用于设置无提示模式执行sql 、-w 参数用于配置客户端连续数据库时间超时
UDS 连接方法
主要是保障数据库在异常情况下 客户端可以登录到服务器端
UDS 只能支持本地登录 本质上UDS 是通过文件方式 模拟tcp通信
UDS 不仅提供紧急会话登录 也适用于普通会话
如果要切换用户会话到UDS路径 需要服务端和客户端分别配置监听UDS socket文件 此时用户登录的会话不再占用紧急预留会话
DV_SESSION 查看会话信息
select * from dv_session where module!="UNKOWN";
zsql user/user_password@uds -d /home/omm/data1 -q -s silent_file -w connect_timeout
连接安全认证
支持配置用户白名单 IP白名单 ip黑名单 有效控制访问连接
用户白名单 : 添加zhba.conf有效条目 以限制指定用户只能从限定的IP访问数据库
IP白名单 : 配置TCP_INVITED_NODES参数 限制只能从指定IP地址访问数据库
IP黑名单 :配置TCP_EXCLUDED_NODES 参数 限制不能从指定IP 访问数据库
IP黑名单 权限最高
配置客户端接入认证
假设服务器地址192.168.1.1 监听端口为1888
配置用户白名单
zhba.conf ----> host user 127.0.0.1,192.168.3.222, 20AB:9217:afcf:feab:fcd0/64
type 当前支持 host hostssl ,host表示普通TCP连接 ,hostssl 表示ssl连接
ipv4 :192.168.3.222
IPV6 : 20AB:9217:afcf:feab:fcd0/64
select value from v$parameter where name = 'tcp_invited_nodes'; #查询白名单
select value from v$parameter where name = "tcp_excluded_nodes" #查询黑名单
在线配置白名单 黑名单
alter system set tcp_invited_noes = "(127.0.0.1, 192.168.0.1, 192.168.2.*)"
alter system set tcp_excluded_nodes = "(192.168.10.*, 192.168.0.255)"
启动监测开关 直接生效
alter system set tcp_valid_node_checking =true ;
ssl证书
双向认证 单向认证