云服务器内容精选

  • RDS for SQL Server添加链接服务器 sql server数据库实例2创建链接服务器访问另外一个sql server数据库实例1。 开启两个实例的分布式事务,请参考开启分布式事务,并且互相加入对端的host信息。线下服务器或ECS服务器请参考远程服务器上的名称解析。 sql server数据库实例2和sql server数据库实例1已经在相同VPC内;若ECS与RDS不在相同VPC或者RDS与线下实例建立分布式请通过EIP进行连接,请参考绑定弹性公网IP为RDS实例绑定EIP。 在rds实例1中使用rdsuser创建数据库dbtest1。 在rds实例2中使用rdsuser运行如下sql创建链接服务器。 USE [master] GO EXEC master.dbo.sp_addlinkedserver @server = N'TEST_SERVERNAME', @srvproduct=N'SQL Server', @provider=N'SQLOLEDB', @datasrc=N'192.168.***.***,1433' EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'TEST_SERVERNAME', @locallogin = NULL , @useself = N'false', @rmtuser = N'rdsuser', @rmtpassword = N'********' GO 表1 参数说明 参数 说明 @server 链接服务器名称。 @srvproduct 数据源的产品名称。使用默认值SQL Server。 @provider 使用该默认值。 @datasrc 要访问的实例IP和端口。 @rmtsrvname 链接服务器名称。 @locallogin 本地服务器上的登录名。默认值NULL即可。 @useself 是否通过模拟本地登录名或登录名和密码连接到链接服务器。此处填false,表示通过登录名和密码连接到链接服务器。 @rmtuser 用户名(rdsuser)。 @rmtpassword 用户密码。 建立dblink之后,在链接服务器中就可以看到rds实例1中建立的库。 使用如下SQL查看是否插入成功,结果如图1所示。 begin tran set xact_abort on INSERT INTO [LYNTEST].[dbtest1].[dbo].[user1] ([id],[lname],[rname]) VALUES('19','w’,'x') GO commit tran 图1 插入结果 父主题: RDS for SQL Server
  • 语法参考 发布 CREATE PUBLICATION用于创建发布,DROP PUBLICATION用于移除发布,ALTER PUBLICATION用于修改发布。 发布创建之后,可以通过ALTER PUBLICATION动态地向发布中添加或移除表,这些操作都是事务性的。 订阅 CREATE SUBSCRIPTION用于创建订阅,DROP SUBSCRIPTION用于移除订阅,ALTER SUBSCRIPTION用于修改订阅。 订阅创建之后,可以通过ALTER SUBSCRIPTION随时暂停与恢复订阅。移除并重建订阅会导致同步信息丢失,这意味着相关数据需要重新进行同步。 具体使用说明请参考以下官方文档,以PostgreSQL 13版本为例: 创建发布:https://www.postgresql.org/docs/13/sql-createpublication.html 删除发布:https://www.postgresql.org/docs/13/sql-droppublication.html 修改发布:https://www.postgresql.org/docs/13/sql-alterpublication.html
  • 订阅使用限制 为了确保使用Failover Slot,必须在发布端手工创建逻辑复制槽(Failover Slot),并通过create_slot = false关联已有复制槽,如下: CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.0.1 port=5432 user=user1 dbname=db1' PUBLICATION pub_name with (create_slot = false,slot_name = FailoverSlot_name); 逻辑复制不会复制DDL变更,因此发布集中的表必须已经存在于订阅端上。 同一个数据库中,可以创建多个subscription,这些subscription可以来自一个或多个发布者。 订阅者的同一张表,不能接受来自同一个源的多个发布。 在创建subscription或者alter subscription时,可以使用enable来启用该订阅,或者使用disable暂停该订阅。 如果要完全删除订阅,使用DROP SUBSCRIPTION,注意,删除订阅后,本地的表不会被删除,数据也不会清除,仅仅是不在接收该订阅的上游信息。 如果订阅与复制槽相关联,就不能在事务块内部执行DROP SUBSCRIPTION。可以使用ALTER SUBSCRIPTION取消关联复制槽。 删除订阅可参考以下步骤: 在订阅端查询订阅关联的的复制槽。 select subname,subconninfo,subslotname from pg_subscription where subname = 'sub2'; subname为订阅者名称。 subconninfo为连接远程主机信息。 subslotname 为远程主机复制槽名称。 在订阅端执行ALTER SUBSCRIPTION取消关联复制槽并删除。 ALTER SUBSCRIPTION subname SET (slot_name = NONE); DROP SUBSCRIPTION subname; 在发布端删除关联的复制槽。 select pg_drop_replication_slot(' slot_name);
  • 发布使用限制 发布目前只能包含表(即:索引,序列号,物化视图这些不会被发布),每个表可以添加到多个发布中。 一个publication允许有多个订阅者。 允许使用all tables发布所有表。 在同一个数据库中,可以创建多个publication,但是不能重名。已创建的publication可以通过查询pg_publication获取。 发布可以筛选所需的变更类型:包括insert、update、delete 和truncate的任意组合,类似触发器事件,默认所有变更都会被发布。 例如:发布表t1的update和delete操作。 CREATE PUBLICATION update_delete_only FOR TABLE t1 WITH (publish = 'update, delete') ; 复制标识:当发布了表的update, delete时,表必须设置复制标识(Replica Identity),如果设置了nothing,则执行update, delete时会报错。 表上的复制标识可以通过查阅pg_class.relreplident获取。 这是一个字符类型的“枚举”,标识用于组装 “复制标识” 的列:d = default ,f = 所有的列,i 使用特定的索引,n 没有复制标识。 表上是否具有可用作复制标识的索引约束,可以通过以下查询获取: SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS name, con.ri AS keys, CASE relreplident WHEN 'd' THEN 'default' WHEN 'n' THEN 'nothing' WHEN 'f' THEN 'full' WHEN 'i' THEN 'index' END AS replica_identity FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid, LATERAL (SELECT array_agg(contype) AS ri FROM pg_constraint WHERE conrelid = c.oid) con WHERE relkind = 'r' AND nspname NOT IN ('pg_catalog', 'information_schema', 'monitor', 'repack', 'pg_toast') ORDER BY 2,3; 复制标识配置 表到复制标识可以通过ALTER TABLE进行修改。 ALTER TABLE table_name REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }; -- 具体有四种形式 ALTER TABLE t_normal REPLICA IDENTITY DEFAULT; -- 使用主键,如果没有主键则为FULL ALTER TABLE t_normal REPLICA IDENTITY FULL; -- 使用整行作为标识 ALTER TABLE t_normal REPLICA IDENTITY USING INDEX t_normal_v_key; -- 使用唯一索引 ALTER TABLE t_normal REPLICA IDENTITY NOTHING; -- 不设置复制标识 复制标识在实际使用中的注意事项 表上有主键,使用默认的default复制标识。 表上没有主键,但是有非空唯一索引,显式配置index复制标识。 表上既没有主键,也没有非空唯一索引,显式配置full复制标识(运行效率非常低,仅能作为兜底方案)。 其他所有情况,都无法正常完成逻辑复制功能。输出的信息不足,可能会报错。 特别需要注意:如果nothing复制标识的表纳入到逻辑复制中,对其进行删改会导致发布端报错。
  • 逻辑定义 发布可以被定义在任何物理复制的主服务器上。定义有发布的节点被称为发布者。发布是从一个表或者一组表生成的改变的集合,也可以被描述为更改集合或者复制集合。每个发布都只存在于一个数据库中。 订阅是逻辑复制的下游端。订阅被定义在其中的节点被称为订阅者。一个订阅会定义到另一个数据库的连接以及它想要订阅的发布集合(一个或者多个)。逻辑订阅者的行为与一个普通的PostgreSQL实例(主库)无异,逻辑订阅者也可以创建自己的发布,拥有自己的订阅者。
  • 约束条件 主实例和灾备实例状态正常,主实例和灾备实例在不同云或不同区域上,且主实例为主备实例,灾备实例为单机实例。 主实例配置容灾能力成功后才能配置灾备实例容灾能力,否则容灾关系会建立失败。 灾备实例的规格要大于等于主实例的规格。 RDS for PostgreSQL 12及以上支持建立跨云或跨区域容灾关系。 不支持跨大版本建立跨云或跨区域容灾关系。 主实例和灾备实例的容灾关系已建立完成,才能进行灾备实例升主和查询容灾复制状态。 实施前确认需要搭建的主实例和灾备实例所在区域,处于云连接/虚拟专有网络服务已上线区域内。 灾备实例不支持PITR恢复和CBR快照备份功能,如需使用此功能,请在主实例上完成。
  • 实现原理 RDS for PostgreSQL跨区域容灾实现原理说明: 在两个数据中心独立部署RDS for PostgreSQL实例,通过RDS接口将生产中心RDS for PostgreSQL库中的数据同步到灾备中心RDS for PostgreSQL库中,实现RDS for PostgreSQL主实例和跨区域灾备实例之间的实时同步。使用该功能前,必须需要确认可以使用云连接服务完成跨区域网络连通。 图1 原理图
  • 接口约束 该接口仅支持MySQL、PostgreSQL引擎。 Serverless型实例不支持该接口。 RDS for PostgreSQL实例中存在异常节点,无法升级小版本。 对于RDS for PostgreSQL 11版本,如果内核小版本小于11.2,则不支持小版本升级。 只支持立即升级,不支持可维护时间段内升级小版本。 RDS for PostgreSQL升级内核小版本后,有可能导致主备节点倒换。
  • 请求示例 配置容灾实例灾备关系,主实例所在的区域为aaa。 POST https://{endpoint}/v3/0483b6b16e954cb88930a360d2c4e663/instances/24c6678f474241fe89ee9c42f768022ein03/action { "build_slave_dr_relation": { "target_instance_id":"c39bd176fb0540929f6add80b91b212cin03", "target_project_id":"054b61972980d4552f0bc00ac8d3f5cd", "target_region":"aaa", "target_ip":"192.168.3.238" } }
  • 请求消息 表2 参数说明 名称 是否必选 参数类型 说明 build_slave_dr_relation 是 Object 配置容灾实例灾备关系所需要的主实例信息。 详情请参见表3。 表3 build_slave_dr_relation字段数据结构说明 名称 是否必选 参数类型 说明 target_instance_id 是 String 主实例的实例ID。 target_project_id 是 String 主实例所在租户的项目ID。 target_region 是 String 主实例所在的区域ID。 target_ip 是 String 主实例的数据虚拟IP(数据VIP)。
  • 接口约束 主实例配置容灾能力成功后才能配置灾备实例容灾能力,否则容灾关系会建立失败。 主实例和灾备实例状态正常,主实例和灾备实例在不同云或不同Region且灾备实例为单实例。 灾备实例的规格要保持大于等于主实例。 灾备实例的底层架构和数据库大版本要与主实例一致。 调用配置灾备实例容灾接口后直至成功搭建容灾关系,不能进行规格变更、主备倒换操作。 RDS for PostgreSQL 12及以上版本支持建立跨云或跨Region容灾关系。 不支持跨大版本建立跨云或跨Region容灾关系。 灾备实例搭建成功后,不能进行小版本升级。 主实例参数被修改后,灾备实例无法同步修改该参数,需结合业务自行修改灾备实例参数。
  • 场景2:对无主键表更新 RDS for MySQL的Binlog采用row格式,对每一行的数据更新,都会形成row格式Binlog event记录。例如:一个update语句更新100行数据,那么row格式的Binlog中会形成100行update记录,备机或只读回放时会执行100次单行update。 只读节点和备机在回放主库的Binlog event时,会根据表的主键或者唯一二级索引来检索需要更改的行。如果对应表未创建主键,则会产生大量的全表扫描,从而降低了Binlog日志的应用速度,产生复制延迟。 排查方法: 通过show create table xxx,分析执行慢的update和delete语句对应的表,分析是否有主键。 解决方法: 给无主键表增加主键,或者酌情增加唯一二级索引。
  • 场景4:只读实例等待MDL锁 只读实例上往往有业务流量,如果存在只读长事务正在执行,会阻塞主实例同步过来的相应表的DDL操作,卡在了表MDL锁获取,进而阻塞所有同表的后续Binlog回放,导致复制延迟越来越大。 排查方法: 登录只读节点,使用如下命令,观察是否有长时间执行的事务。 select t.*,to_seconds(now())-to_seconds(t.trx_started) idle_time from INFORMATION_SCHEMA.INNODB_TRX t \G; 查看只读节点的MDL锁视图,观察是否有MDL锁冲突。 select * from information_schema.metadata_lock_info; 根据MDL锁视图中的线程ID,找到阻塞的session。更多信息,请参见MDL锁视图。 解决方法: kill只读节点上阻塞DDL操作的长事务,或者在业务侧提交该长事务。
  • 场景1:主库执行了大事务 大事务一般指一个事务中包含大量的数据更新操作,例如一个事务包含几万次DML(insert,update,delete)操作、一条SQL语句批量更新了上万行数据等,大事务往往本身的执行时间很长(分钟级)。当主实例执行了大事务后,会产生大量的Binlog日志,备机或只读节点拉取这些Binlog耗时比一般事务长,且至少需要花费与主实例相同的时间来回放这些事务的更新,从而导致备机或只读节点出现复制延迟。 排查方法: 对于包含大量DML语句的大事务,使用如下命令,找到长时间执行的事务。 select t.*,to_seconds(now())-to_seconds(t.trx_started) idle_time from INFORMATION_SCHEMA.INNODB_TRX t \G; 对于一条SQL语句执行大量数据的大事务,执行show full processlist,查找是否存在长时间执行的delete或update语句。 分析全量日志或慢日志,检查是否有大事务。 解决方法: 为了保证主从数据的一致性,需要等待大事务执行完成,主备复制延迟才能恢复。 业务侧避免此类大事务,可以将大事务拆分为小事务,分批执行。例如,通过where条件或limit语句限制每次要更新的数据量。
  • 操作场景 RDS for SQL Server具有强大的死锁检测功能。当多个用户同时访问同一资源时,可能会出现死锁现象,即两个或多个进程互相等待对方释放资源,导致所有进程都无法继续执行。此时,SQL Server将选择其中一个进程终止(Kill),其他进程就可以完成其事务。 为解决上述问题,提供了锁统计页面。通过查看该页面,可快速定位数据库中发生的多种类型的死锁。死锁的详细信息页面展示了事务开始执行的时间、会话ID、被锁资源详情、死锁的模式等信息,帮助您定位和优化引发死锁的问题SQL及其他异常。 不升级高级智能运维包的情况下,最多只保留7天的记录。