华为云用户手册

  • 迁移准备 云数据库RDS服务支持开启公网访问功能,通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问云数据库RDS。 准备弹性云服务器或可通过公网访问云数据库RDS。 通过弹性云服务器连接云数据库RDS实例,需要创建一台弹性云服务器。 通过公网地址连接云数据库RDS实例,需具备以下条件。 先对云数据库RDS实例绑定公网地址,如何绑定公网地址,请参见绑定弹性公网IP。 保证本地设备可以访问云数据库RDS实例绑定的公网地址。 在准备的弹性云服务器或可访问云数据库RDS的设备上,安装MySQL客户端。 请参见如何安装MySQL客户端。 该弹性云服务器或可访问云数据库RDS的设备需要安装和RDS for MySQL数据库服务端相同版本的数据库客户端,MySQL数据库或客户端会自带mysqldump和mysql工具。 数据迁移到云数据库RDS后可能要面对更改IP的问题,为减少客户业务更改,降低迁移难度,支持更改内网IP,具体请参见修改内网地址。 云数据库RDS的系统库mysql和sys不支持导入到RDS for MySQ L实例
  • 常见参数的修改 表1 常见参数的修改 参数名 描述 文档链接 time_zone 时区。当实例类型为只读实例时,请务必保证该参数的值与主实例上该参数的值保持一致。 如何修改时区 default_password_lifetime 定义了全局自动密码过期策略,单位为天。 RDS for MySQL密码过期策略 tx_isolation 指定默认的事务隔离等级。 如何修改云数据库RDS的事务隔离等级 character_set_server 服务器字符集。 使用utf8mb4字符集存储emoji表情到RDS for MySQL实例 lower_case_table_names 如果设为0,表格名称被存储成固定并且表名称将是大小写敏感的。如果设为1,表格名称被存储成小写并且表名称将是大小写不敏感的。 RDS for MySQL如何设置表名是否区分大小写 group_concat_max_len 函数GROUP_CONCAT()结果的最大长度。 GROUP_CONCAT结果不符合预期 max_connections 允许同时连接的客户端总数。如果设定值为default,表示该参数随内存规格变化。 RDS数据库实例支持的最大数据连接数是多少
  • 测试步骤 创建4张表,表结构如下: CREATE TABLE if not exists users ( `rid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `nid` bigint(20) DEFAULT NULL, `level` int(11) DEFAULT NULL, `vip` int(11) DEFAULT NULL, `vip_exp` int(11) DEFAULT NULL, `reg_channel` int(11) DEFAULT NULL, `guild_id` bigint(20) unsigned DEFAULT '0', `guild_open` tinyint(1) DEFAULT '0', `forbid_login_time` bigint(20) DEFAULT NULL, `forbid_talk_time` bigint(20) DEFAULT NULL, `ctime` bigint(20) DEFAULT NULL, `mtime` datetime(3) DEFAULT NULL, `last_offline_time` bigint(20) DEFAULT NULL, `friend_open` tinyint(1) DEFAULT '0', `user_data_str` mediumblob, `name` varchar(64) DEFAULT NULL, `db_fix_version` int(10) DEFAULT '0', PRIMARY KEY (`rid`), KEY `idx_users_99_nid` (`nid`), KEY `idx_users_99_level` (`level`), KEY `idx_users_99_ctime` (`ctime`), KEY `idx_users_99_mtime` (`mtime`), KEY `idx_users_99_last_offline_time` (`last_offline_time`), KEY `idx_users_99_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=4393751571200 DEFAULT CHARSET=utf8mb4; 分别给每张表插入3000万行数据。 使用MySQL原生copy算法在表1中添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。 使用MySQL原生inplace算法在表2添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。 使用gh-ost工具在表3中添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。 记录DDL和DML语句执行时间。 表1 测试数据(单位:s) 执行操作 MySQL Copy MySQL Inplace gh-ost 增加一列 1294.29 755.52 1876.79 select 1.35 1.29 1.29 update 1266.78 0.19 0.11 insert 1296.19 7.47 4.49
  • 使用限制 使用场景的限制: 部分场景下增加、删除、重命名(MySQL 8.0.28之后)列。 设置或删除列的默认值。 修改ENUM或SET列的定义。 更改索引的类型(BTREE | HASH)。 增加或删除虚拟列。 表名重命名。 添加或删除列的限制: 不支持有其他INSTANT语句在同一行的操作在同一条语句的情况。 新增列将会放到最后,不支持改变列的顺序(MySQL 8.0.29后支持任意位置加列)。 不支持在行格式为COMPRESSED的表上快速加列或删除。 不支持在已经有全文索引的表上快速加列或删除。 不支持在临时表上快速加列或删除。 重命名列的限制: 不支持重命名被其他表引用的列。 不支持重命名列的操作与生成或者删除虚拟列在同一个语句中。 修改ENUM或SET列的限制: 不支持ENUM或者SET列数据类型占用的存储空间发生变化。 增加或删除虚拟列的限制: 不支持对分区表的增加或删除操作。
  • 新的数据字典信息 在执行instant add column的过程中,MySQL会将第一次intant add column之前的字段个数以及每次加的列的默认值保存在tables系统表的“se_private_data”字段中。 dd::Table::se_private_data::instant_col:第一次instant add column之前表上的列的个数。 dd::Column::se_private_data::default_null:标识instant column的默认值是否为NULL。 dd::Column::se_private_data::default:当instant column的默认值不是NULL时存储具体的默认值,column default value需要从InnoDB类型byte转换成“se_private_data”中的char类型。
  • 背景 通常情况下大表的DDL操作都会对业务产生很大的影响,需要在业务低峰期做。MySQL 5.7支持原生DDL工具Copy和Inplace算法、以及开源DDL工具gh-ost,减少了DDL期间DML操作被阻塞的情况。但是大表DDL仍然需要花费很长时间。 instant秒级加列算法,让添加列的时候不再需要rebuild整个表,只需要在表的metadata中记录新增列的基本信息即可,可以很快执行完成。但是目前支持的DDL操作有限。
  • 载入数据字典 MySQL从系统表读取表定义时,会将instant column相关的信息载入到InnoDB的表对象“dict_table_t”和索引对象“dict_index_t”中。 dict_table_t::n_instant_cols:第一次instant add column之前的非虚拟字段个数(包含系统列)。 dict_index_t::instant_cols:用于标示是否存在Instant column。 dict_index_t::n_instant_nullable:第一次instant add column之前的可为NULL的字段个数。 dict_col_t::instant_default:存储instant列默认值及其长度。
  • 记录格式 为了支持instant add column,针对COMPACT和DYNAMIC类型引入了新的记录格式,主要为了记录字段的个数信息。 如果没有执行过instant add column操作,则表的行记录格式保持不变。 如果执行过instant add column操作,则所有新的记录都会设置一个特殊的标记,同时在记录内存储字段的个数。 INSTANT_FLAG使用了info bits中的一个bit位,如果记录是第一次instant add column之后插入的,该flag被设置为1。 图1 记录格式
  • 背景 Percona社区的pt-osc的开源DDL工具依赖于触发器来将源表的写操作映射到新表。虽然使用触发器可以提高同步的效率,但触发器执行的开销会对于主库的性能产生很大的影响。另外拷贝数据和变更数据可能处于并行状态,如果在迁移过程中对表的更新比较频繁会引入大量的锁竞争问题。 gh-ost是GitHub开源的一款在线DDL工具,相比pt-osc不依赖于触发器,而是通过模拟从库,在格式为ROW的Binlog中获取增量的变更,再异步同步到镜像表中。其将迁移的写入负载与主服务器的工作负载分离,避免了对于主库性能的影响。同时异步执行增量变更也规避了触发器导致的锁竞争问题。此外gh-ost维护了一张心跳表,用来记录DDL过程中的每个阶段,在出现异常时,可以从根据心跳日志恢复到指定位置,解决了pt-osc在运行过程中出现异常,需要从头开始的局限。
  • gh-ost三种模式架构 连接从库,在主库转换(默认) 在主库创建和原表结构相同的_xxx_gho表,和变更记录日志文件_xxx_ghc表,用来写入Online-DDL的进度以及时间。 修改_xxx_gho表的结构。 在主库上拷贝已有的数据到_xxx_gho。 从备库上获取增量Binlog,完成增量数据的变更。 在源表上加锁,确认_xxx_ghc表中的时间,保证数据同步。 用_xxx_gho替换源表。 连接主库,在主库转换 在主库创建_xxx_gho表和_xxx_ghc表。 修改_xxx_gho表的结构。 在主库上拷贝源表的数据已有的数据到_xxx_gho。 在主库上获取增量Binlog,完成增量数据的变更。 在源表上加锁,确认_xxx_ghc表中的时间,保证数据同步。 用_xxx_gho表替换源表。 在从库上测试和转换 该模式下gh-ost会简单连接到主库,但是所有的操作都是在从库上进行,不会对主库进行任何改动。 “-migrate-on-replica”选项让 gh-ost 直接在从库上修改表。最终的切换过程也是在从库正常复制的状态下完成的。 “-test-on-replica”表明操作只是为了测试目的。在进行最终的切换操作之前,复制会被停止。原始表和临时表会相互切换,再切换回来,最终相当于原始表没变动。主从复制暂停的状态下,可以检查和对比这两张表中的数据。
  • 参考案例 gh-ost -max-load=Threads_running=20 \ -critical-load=Threads_running=100 \ -chunk-size=2000 -user="temp" -password="test" -host=**.*.*.* \ -allow-on-master -database="sbtest" -table="sbtest1" \ -alter="engine=innodb" -cut-over=default \ -exact-rowcount -concurrent-rowcount -default-retries=120 \ -timestamp-old-table -assume-rbr -panic-flag-file=/tmp/ghost.panic.flag \ -execute
  • 使用限制 Binlog格式必须使用row,且“binlog_row_image”的值必须是“FULL”。 需要用户的权限为:SUPER, REPLICATION CLIENT, REPLICATION SLAVE on *.* and ALL on dbname.* 如果确认Binlog的格式为row,那么可以加上“-assume-rbr”,则不再需要super权限。 不支持带有外键约束的表。 不支持带有触发器的表。 执行DDL前后的表,需要有相同的主键或者有非空的唯一索引。 迁移表的主键或者非空唯一索引包含枚举类型时,迁移效率会大幅度降低。
  • Copy算法 按照原表定义创建一个新的临时表。 对原表加写锁(禁止DML)。 在1建立的临时表执行DDL。 将原表中的数据copy到临时表。 释放原表的写锁。 将原表删除,并将临时表重命名为原表。 采用copy方式期间需要锁表,禁止DML写操作。当Lock = Shared时允许读操作,不允许写操作;当Lock = Exclusive时,读写操作都被禁止,因此不能实现Online。但这种方法可以应用在几乎全部DDL场景下。
  • Inplace算法 Inplace采用在原表上进行更改的方法,不需要生成临时表,不需要进行数据copy的过程。可分为两类: rebuild:需要重建表(重新组织聚簇索引)。比如optimize table、添加索引、添加/删除列、修改列NULL/NOT NULL属性等。 no-rebuild:不需要重建表,只需要修改表的元数据,比如删除索引、修改列名、修改列默认值、修改列自增值等。 对于rebuild方式实现Online是通过缓存DDL期间的DML,待DDL完成之后,将DML应用到表上来实现的。由于MDL写锁在拷贝数据期间降为MDL读锁,DML操作在DDL执行期间几乎不会被阻塞。
  • Inplace算法使用限制 Inplace算法支持大部分DDL操作,只有少数场景下只能利用Copy算法。 不支持删除主键,但不同时添加另外一个主键。 不支持更改横的数据类型。 不支持扩展varchar列的长度从小于256位到大于256位,因为占用的空间从1个字节会变更到2个字节。不支持减少varchar类型列的长度。 不支持修改virtual column和stored column的顺序。 不支持在参数foreign_key_checks = 1时添加外键约束。 不支持对表进行分区,优化分区,删除分区。
  • DDL工具简介 MySQL 5.6之前数据库中对大表的表结构修改的DDL操作通常会引发DML语句阻塞,复制延迟升高等问题,导致数据库对外呈现出一种“异常”的状态。本文介绍了MySQL原生的数据库DDL方式Copy和Inplace算法、开源工具gh-ost以及MySQL 8.0新增的Instant秒级加列的算法的原理,使用限制,适用场景等。 MySQL原生的Copy算法由于在拷贝数据的过程中对源表加MDL写锁,导致DML语句被长时间阻塞,已经不推荐使用。 Inplace算法相比Copy算法有很大的改进,采用在原表上进行更改的方法,不需要生成临时表,占用的额外空间小。同时Inplace操作只需要短暂的持有MDL写锁,不会造成DML操作被长时间阻塞。但是对大表的表结构修改,依然要消耗大量的时间,导致备机在回放DDL语句时产生较大的复制延迟。 开源gh-ost将一个DDL操作拆分成多个小操作,减少单次操作的时间来降低复制延迟。同时只有在最后rename镜像表和原表的过程中才会短暂阻塞读写操作。gh-ost基于Binlog回放增量数据,同时额外维护了额外的心跳表来记录DDL执行过程,支持临时暂停DDL过程。这些机制导致gh-ost的执行时间比原生的DDL算法略长。 MySQL 8.0之后提出的instant秒级加列算法,不再需要rebuild整个表,只需要在表的metadata中记录新增列的基本信息即可。这种方式将大表的加列操作降低到了秒级。但是目前这种方式的应用场景只局限在添加列,设置列默认值,删除列默认值,修改ENUM/SET列的定义等少量DDL场景。 根据每种算法和工具的特点,建议在可以使用instant算法的DDL场景和版本下,尽可能使用instant算法来减少DDL对整个业务的影响。此外的其他情况,如果客户是主备或含有只读实例的场景,且对复制延迟带来的影响容忍较低的情况下,使用gh-ost工具来进行DDL操作。如果客户需要快速变更表结构,可以容忍短时间的主备不一致的问题,用Inplace算法可以满足需求。Copy算法由于会长时间阻塞DML操作,占用大量磁盘空间,且执行时间较长,目前在可以应用其他算法和工具的场景下不推荐使用。 表1 DDL工具说明 方法 MySQL Copy MySQL Inplace gh-ost instant DDL过程中读取数据 允许 允许 允许 允许 DDL过程中写入数据 不允许 允许(短暂时间不允许) 允许(短暂时间不允许) 允许 额外空间占用 大 小(需要rebuild会略高) 大 小 执行时间 非常长 长 非常长 短 复制延迟 大 大 小 小 父主题: MySQL Online DDL工具使用
  • 注意事项 目前仅支持MySQL到GeminiDB Redis接口Hash类型的转换。 新规则的Redis键前缀+键分隔符不能是已有规则的Redis键前缀+键分隔符的子前缀,反之亦然。例如新规则的前缀为 "pre1:",键分隔符为 "," ,老规则前缀为 "pre1",分隔符为":", 这种情况不允许创建新规则。 如果修改映射规则中MySQL实例的表名后,则需要重新配置映射规则。 暂不支持ENUM、SET、JSON三种数据类型的同步。 如果对映射规则中键(Key)字段中的一个或多个字段执行改名、删除等操作时,会使映射规则失效。
  • 内存加速概述 内存加速是GeminiDB Redis为了优化“传统被动缓存方案”而推出的功能,它可以让用户通过界面配置规则的形式,自动缓存MySQL的数据,加速MySQL的访问。 如下图图1所示,“传统被动缓存方案”需要用户自行开发代码把MySQL中的数据写入到缓存中,存在效率低、不可靠的缺点。而采用云数据内存加速的“全自动主动缓存方案”,支持界面可视化配置,配置完成后即可实现数据自动同步。同时还支持数据过滤及过期等功能,极大提高了开发效率及数据的可靠性。 图1 原理图 父主题: 内存加速
  • 约束限制 转为高可用只读实例时,原只读规格支持SSD云盘、本地盘: SSD云盘:支持通用型、独享型和鲲鹏通用增强型。 本地盘:支持x86通用型和x86独享型。本地盘单机版只读实例如果需要转为高可用只读,请联系客服申请。 DEC用户支持创建高可用只读实例以及只读转高可用,资源类型选择“专属存储”时,默认只显示购买专属分布式存储服务时选择的存储类型。 证书、磁盘加密、端口、子网信息跟已有高可用只读一致(若没有高可用只读,则跟主实例一致)时,非高可用只读才可变更到高可用只读。 创建高可用只读或是变更到高可用只读时,需要保证实例所在子网的可用私有IP数量≥ 3。 不建议修改高可用只读实例的参数,否则会影响到高可用只读的可靠性。 高可用只读不允许进行如下操作:修改端口、转换到非高可用只读实例。 单机版只读转为高可用只读对业务没有影响。
  • 修改内网 域名 在“实例管理”页面,选择指定的实例,单击实例名称,进入实例概览页面。 在左侧导航栏,选择“数据库代理”。 在代理基本信息的“内网域名”处,单击“修改”。 图2 代理信息 在弹框中,填写新域名,单击“确定”。 图3 修改内网域名 内网域名只允许修改前缀部分。 内网域名前缀部分长度为8~63个字符,只能包含小写字母或数字。 新的内网域名不可与当前已存在的有效域名重复。 如果不再使用内网域名,单击“内网域名”处的“删除”,删除内网域名。
  • 恢复增量备份(日志备份) 恢复日志备份前提是要先恢复数据备份,并且数据库处于Restoring状态。日志备份必须连续,即必须按照同一个库的备份顺序进行恢复,缺少其中的任何备份都将导致无法恢复到最后的日志备份数据。 参考1~4配置恢复数据备份。 单击“Option”,Recovery state选择“RESTORE WITH NORECOVERY”。 图6 选择Recovery state 检查数据库恢复出来的状态为“Restoring”。 图7 检查恢复状态 右键单击要恢复的数据库,单击恢复“Transaction Log”。 图8 选择数据库 选择device以及添加要恢复的备份文件。 图9 添加备份文件 如果不是最后一个增量备份文件,还需要继续恢复其他增量备份,需要修改option的Recovery state为“RESTORE WITH NORECOVERY”,否则选择“RESTORE WITH RECOVERY”,单击“OK”进行恢复。 图10 恢复日志备份 如果还有其他增量备份需要恢复,请重复执行4-6,直到最后一个日志备份恢复完成。
  • 常见问题 问:下载的bak中找不到目标库,只有rdsadmin库可以恢复吗? 答:解决方法如下: 下载的备份文件里面有两个备份,第一个备份为rdsadmin,第二个为目标库test。 查看备份文件头信息。 restore headeronly from disk='bak文件本地路径' 图11 查看备份文件信息 查看内部文件信息。 restore filelistonly from disk='bak文件本地路径' 默认只读取第一个备份库的信息。 图12 查看内部文件信息 如果需要读取第二个或者第三个库,需要加上with file,具体的值为restore headeronly得到的结果中的position的值。 restore filelistonly from disk='bak文件本地路径' with file=2 图13 查看其他库信息 恢复数据。 图14 恢复数据 USE [master] RESTORE DATABASE [@dbname] FROM DISK='@path' WITH FILE= @file MOVE '@logicalname1' TO '@filepath1' MOVE '@logicalname2' TO '@filepath2' NOUNLOAD, STATS=5 GO @dbname:库名。 @path:全备文件路径。 @file:数据库在bak文件中的位置,执行restore headeronly时获得的position的值。 @logicalname1:备份文件中的LogicalName,和新库的文件路径,LogicalName为执行restore filelistonly时获得的LogicalName的值。 @filepath1:物理文件存放在本地的路径。 @logicalname2:同@logicalname1。 @filepath2:同@filepath1。 根据2获取到的恢复头信息,拼接到上述的SQL中,然后执行上述SQL进行恢复。
  • 恢复数据备份 使用微软官方工具SQL Server Management Studio (S SMS )登录自建数据库。 图1 登录自建数据库 右键单击“Databases”目录,选择“Restore Database”。 图2 选择数据库 选择“Device”,添加bak备份文件,单击“OK”。 图3 添加备份文件 选择要恢复的数据库,Source中的Database可以下拉选择要恢复的源库,Destination的Database可以修改要恢复的目标库名。 图4 选择源库和目标库 单击“OK”,恢复成功。 图5 恢复成功
  • 约束限制 开启数据库代理 按需计费实例开启数据库代理时,仅支持选择按需计费的代理实例。 包周期实例开启数据库代理时,支持选择按需计费或包周期代理实例。 如需选择包周期代理实例,请联系客服人员开通权限。 包周期代理实例的默认到期时间和包周期实例的到期时间一致。 如果包周期实例开启自动续费,代理实例也默认开启自动续费。 代理计费模式转换 按需代理转包周期需要具有相应的操作权限,您可联系客服人员申请。 HA模式的按需代理不支持转包周期。 数据库代理支持和数据库实例一起按需转包周期,该功能目前仅支持华南-广州、华东-上海一、中国-香港区域。
  • Parse模式场景说明 当Multi-Statements包含如下场景时,后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 Multi-Statements内创建临时表。 Multi-Statements内创建存储过程。 Multi-Statements内含未提交的事务(如执行了begin,但未commit或rollback)。 Multi-Statements过于复杂或含特殊语法等导致Multi-Statements解析失败。 更改Multi-Statements模式立即生效,无需重启数据库代理。但如果模式切换前存在因为执行了Multi-Statements导致读写分离失效的连接,不会因为切换模式而恢复读写分离,需要断开重连才能恢复。
  • 模式描述 Strict模式(默认):该模式下,Multi-Statements会发往主节点,当前连接的后续请求读写分离失效,会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。该模式不会解析Multi-Statements,性能好,适合短连接、无连接复用场景。 Loose模式:该模式下,Multi-Statements会发往主节点,当前连接的后续请求依旧可以读写分离。该模式不会解析Multi-Statements,性能好,适合Multi-Statements内仅含DML SQL,不含设置session变量、创建临时表、创建存储过程、执行未提交事务等操作的场景。 Parse模式:该模式下,只读Multi-Statements会根据权重路由,读写混合Multi-Statements会发往主节点,同时数据库代理会解析Multi-Statements,根据Multi-Statements内包含的SQL情况(具体见Parse模式场景说明),决定当前连接的后续请求是否恢复读写分离,由于该模式会解析Multi-Statements,对代理性能有一定影响,影响程度与Multi-Statements的长度和复杂性相关,建议Multi-Statements小于100MB,避免数据库代理解析SQL消耗过多的资源,引起性能明显下降。
  • 使用限制 仅RDS for MySQL 8.0和5.7版本支持连接池功能。 代理实例的状态必须均为“正常”。 不兼容ALT特性,开启ALT会导致连接池失效。 当执行以下行为时,会锁定连接,直至连接结束,即该连接不会再被放到连接池中供其他用户连接使用。 执行PREPARE语句 创建临时表 修改用户变量 大数据插入查询(例如16 MB以上) 使用lock table 多语句(带分号的拼接SQL,例如SELECT 1;SELECT 2) 存储过程调用
  • 注意事项 某些业务对全局一致性有要求,开启事务拆分后将不满足全局一致性,因此在开启事务拆分前请评估事务拆分功能是否适用于您的业务。 代理实例的状态必须均为“正常”。 开启事务拆分时,需要将代理更新至最新版本,新版本优化了事务的处理逻辑。 开启事务拆分后,使用BEGIN提交事务后的读请求暂时不支持拆分到读库。 开启事务拆分后,使用SET AUTOCOMMIT = 0开启的事务,COMMIT提交后的读请求不支持拆分到读库。
  • 约束限制 创建高可用只读实例时,高可用只读规格支持SSD云盘、本地盘: SSD云盘:支持通用型、独享型、惠选型和鲲鹏通用增强型。 本地盘:支持x86通用型和x86独享型。 转为高可用只读实例时,原只读规格支持SSD云盘、本地盘: SSD云盘:支持通用型、独享型、惠选型和鲲鹏通用增强型。 本地盘:支持x86通用型和x86独享型。本地盘单机版只读实例如果需要转为高可用只读,请联系客服申请。 DEC用户支持创建高可用只读实例以及只读转高可用,资源类型选择“专属存储”时,默认只显示购买专属分布式存储服务时选择的存储类型。 创建时不支持设置证书、磁盘加密、端口、子网信息,上述信息均与已有高可用只读一致,如果没有创建过高可用只读实例,则与主实例保持一致。 证书、磁盘加密、端口、子网信息跟已有高可用只读一致(若没有高可用只读,则跟主实例一致)时,非高可用只读才可变更到高可用只读。 创建高可用只读或是变更到高可用只读时,需要保证实例所在子网的可用私有IP数量≥ 3。 不建议修改高可用只读实例的参数,否则会影响到高可用只读的可靠性。 高可用只读不允许进行如下操作:修改端口、转换到非高可用只读实例。 建议创建只读实例时,设置实例规格不低于主实例,否则可能导致创建只读失败和复制延迟升高。 创建只读实例时不要有DDL操作,否则可能会导致创建只读失败。
  • 语法限制 读写分离请求路由原理:客户的前端请求会根据当前数据库节点权重的配置,随机路由到后端任一数据库节点。 因此,一些SQL语句多次执行的结果可能存在差异,部分语句列举如下: 使用读写分离地址连接proxy和直连后端数据库执行show processlist结果返回有差异,因为proxy的show processlist是逻辑的,仅仅将通过proxy节点下发的业务展示出来,所以和直连后端数据库有差异。 当某一个代理节点处于异常状态时,通过读写分离地址连接proxy执行show processlist或者kill时,有可能会出现命令执行时间稍微变长或卡顿的情况,此时无需关注,业务不会受到影响。 当数据库代理节点缩容后,通过代理执行show processlist命令时,可能会将被缩容的节点上的业务展示出来。 通过数据库代理进行kill时,可能会出现超时等报错信息,此时可以通过再次执行show processlist查看业务是否真正被kill成功。 通过数据库代理的请求只能通过代理进行kill操作。 使用读写分离的连接地址时,不支持使用show errors和show warnings命令。 使用读写分离的连接地址时,如果存储过程(procedure)和函数(function)中依赖了用户变量,即@variable,则运行结果可能不正确。
共100000条