锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。innodb存储引擎会在行级别上对表数据上锁,这固然不错,不过innodb存储引擎也会在数据库内部其他多个地方使用锁,从而允许对多种不同资源提供并发访问。操作缓存池的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入,数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。
为了保证数据库的安全,数据库的管理员会对需要操作数据库的人员分配账号与可操作的权限范围,让其仅能够在自己权限范围内操作。
本文讲解的华为云之锁与权限为您的数仓保驾护航主要从以下两方面介绍
- DWS锁机制介绍&排查处理方法
- DWS权限管理机制
数据仓库服务,Data Warehouse Service,简称GaussDB(DWS),是一种基于公有云基础架构和平台的在线数据处理数据库,提供即开即用、可扩展且完全托管的分析型数据库服务。GaussDB(DWS)是基于华为云原生融合数据仓库GaussDB产品的服务,兼容标准ANSI SQL 99和SQL 2003,为各行业PB级海量大数据分析提供有竞争力的解决方案。
事务隔离性问题:如果不考虑事务的隔离性,会出现以下问题:
- 脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。
- 不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据。
- 幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。在一次的事务操作中,先读取了几行数据后,另一个事务又增加或删除了数据,在此之后,此事务又去读取数据,发现数据凭空生成或消失,跟幻觉一样,即幻读。
数据库并发场景有三种,分别为:
- 读-读:不存在任何问题,也不需要并发控制,因为读数据并不影响其他业务操作。
- 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读。
- 写-写:有线程安全问题,可能会存在更新丢失问题,比如库存业务,两个业务查询数据相同,一个库存加一,另一个库存加二,这样双写只能有一方成功,另外一个会被覆盖。
目前较为常见的三种并发控制机制:
- 悲观锁:当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观锁。
- 乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
- 多版本并发控制(MVCC):MVCC会保存某个时间点上的数据快照。这意味着事务可以看到一个一致的数据视图,不管他们需要跑多久。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。
- 自旋锁(Spin Lock):是一种和硬件结合的互斥锁,借用了硬件提供的原子操作的原语来对一些共享变量进行封锁,通常适用于临界区比较小的情况。特点是:封锁时间很短、无死锁检测机制和等待队列、事务结束时不会自动释放SpinLock。
- 轻量锁(Lightweight Lock):负责保护共享内存中的数据结构,有共享和排他两种模式,类似Oracle中的latch。特点是:封锁时间较短、无死锁检测机制、有等待队列、事务结束时会自动释放。
- 常规锁(Regular Lock):就是通常说的对数据库对象的锁。按照锁粒度,可以分为表锁、页锁、行锁等;按照等级,pg锁一共有8个等级。特点是:封锁时间可以很长、有死锁检测机制和等待队列、事务结束时会自动释放。
DWS最常见的锁是Relation级别的常规锁(表级锁),业务在并发设计不合理或调度混乱时容易出现等锁报错或者由于等锁导致语句执行慢的问题。
表级锁要等到事务结束之后释放,当两个事务产生锁冲突时,未拿到锁的线程会等待,超过lockwait_timeout参数设置的时间后报错。
表级锁的特点之一是有等待队列。 因此当出现等锁事件时,锁等待队列可能会放大这种等锁情况带来的影响,因此要尽量避免互斥语句的并发操作。
锁机制的处理方法的流程主要有:判断是否等待、找到持锁线程、终止异常语句。
4.4.1 判断是否等待
判断是否等待的处理方法主要有以下三种:
- 业务语句报错:Lock wait timeout
- 查看活跃视图pgxc_stat_activity的waiting字段,如果为t,表示在cn上等锁
- 通过等待视图pgxc_thread_wait_status中的wait_status字段判断,如果为acquire lock且wait_event为relation,说明在等锁
4.4.2 找到持锁线程
判断是否等待的处理方法主要有以下三种:
- 缩短报错时间,在语句执行前设置:
- 通过pgxc_lock_conflicts查看冲突关系
- 通过pg_locks查看(https://bbs.huaweicloud.com/blogs/228809)到对应实例节点上查询pg_locks找到持锁与的pid
4.4.3 终止异常语句
4.4.4 业务开发建议
- 合理安排调度任务,避免在高峰期对同一张表alter或vacuum full等
- 执行时间异常的语句及时处理,或配置异常规则避免语句执行过长
- 出现等锁报错不要慌,根据报错信息和视图找出“元凶”
1、系统权限
系统权限又称为用户属性,包括:
- SYSADMIN
- CREATEDB
- CREATEROLE
- AUDITADMIN
- LOGIN
除SYSADMIN外,不能被GRANT,只能通过ALTER USER的方式修改。
2、对象权限
- 数据库对象:
- 模式对象
- 表对象
- 其他对象(函数、视图等)
可以通过GRANT/REVOKE赋予和回收
TIPS:系统权限无法通过role和user的权限被继承。
1、用户
用户是什么
- 使用数据库系统服务的个体
- 职责单一,往往附属于某个组织或部门
- 创建用户后会创建同名schema
用户可以做什么?
- 使用工具连接数据库
- 访问数据库对象
- 执行sq|语句
2、角色
- 按照责任划分具有不同权限的角色
- 角色用来作为权限集合的载体
- 代表一个用户或一组用户的行为约束
3、用户与角色
- 用户可以被赋予一个或多个角色
- 用户是实体,角色是行为
- DWS中,用户和角色使用相同的方式操作
- gs_role_read_all_stats:是否有权限访问pgxc视图
- gs_role_signal_backend:是否有权限使用信号函数(pg_terminate_backend)
- gs_role_analyze_any:是否有权限对任意表做analyze
- gs_role_vacuum__any:是否有权限对任意表做vacuum
预置角色无法修改,无法删除,无法登录,仅供运维授权使用。
查看系统权限:pg_roles
查看对象权限(以表为例):pg_class.relacl
查询的回显结果为以下形式:
对某个schema下的所有表赋予查询权限
对某个schema下未来创建的表赋权
创建只读用户
2.5.1 问题一
2.5.1 问题二
- 权限分为系统权限和对象权限,对象权限可以根据角色管理
- DWS有几个默认角色可以供授权使用
- 根据报错的具体对象类型,合理配置用户权限
开发者论坛链接:https://bbs.huaweicloud.com/forum/forumdisplay-fid-598.html
使用方式1:
使用方式2:
1.点击GaussDB(DWS)公众号目录栏-联系我们一智能客服,扫码进入提问;
2.选择大数据一数据仓库服务,即可开启提问;
3.输入需要查询的问题,如:数据怎么导入DWS,点击查看全部查看相关内容。
本文整理自华为云社区【内容共创】活动第21期。
查看活动详情:https://bbs.huaweicloud.com/blogs/380503