共享 MySQL ############ 服务概述 ========= 共享 MySQL 服务是新浪云基于 MySQL-5.6 开发的一个共享数据库服务,您仅需几秒钟即可获得一个包括主从节点、高可用服务、自动备份、在线扩容以及监控等各种管理功能的 MySQL 服务。 不同于 :doc:`rds` ,创建一个共享 MySQL 数据库并不会创建新的 `mysql-server(mysqld) `_ 实例,而只是在已有的 mysql-server 集群里选择一个实例,然后在这个实例上调用 ``CREATE DATABASE app_$APPNAME`` 创建一个新的 database 供您使用。 **主从架构** 共享 MySQL 数据库采用主从架构,当数据库发生故障或延迟时,系统会在秒级内自动切换,保证服务稳定可靠。 MySQL 从库有时候会因为网络抖动或者用户 SQL 语句不够优化,导致从库数据同步会有些微延时(3-10 秒)。如果您有对数据实时性要求比较高的查询,建议在主库上进行操作。 **性能** 共享 MySQL 数据库可以支持最高百万级的数据库访问,对于数据库性能要求更高的应用建议使用 :doc:`rds` 。 **MySQL 存储引擎** 共享 MySQL 数据库服务支持 MyISAM 和 InnoDB 引擎,目前 InnoDb 引擎仅对企业版开放,详见 `企业版介绍 `_ 。 **安全和隔离** 共享 MySQL 数据库服务通过 RDC(我们为共享数据库服务开发的高性能 MySQL 代理)和 MySQL 本身的认证机制来实现数据库和数据库之间的隔离。所有的数据库连接会首先连接 RDC,在 RDC 认证通过之后,由 RDC 将连接代理给实际的后端数据库。 RDC 的功能主要如下: - 通过其强隔绝性为数据库提供更高的安全性,保障您的数据安全。 - 通过预判用户执行的 SQL 语句,提前拦截可能损伤系统的 SQL 语句。 RDC 会对所有的 SQL 语句执行以下预判,如果超过了其限制,RDC 会直接拦截这个 SQL 查询,返回查询错误,您可以根据 MySQL 错误码判断该请求是否是被 RDC 拦截以及拦截的原因。 .. _rdc-block-rules: =============================== =========================================== =============== 预判条件 相关错误信息 限额 =============================== =========================================== =============== 单表的最大行数 Table has too many rows 10,000,000 行 库的最大表数量 Database has too many tables 512 个 不支持的存储引擎类型 Not support table type memory, temporary 不支持的内置函数 Not support function sleep, benchmark 最大外排序的行数 Filesort on too many rows 100,000 行 最大无索引的操作行数 Select on too many rows without index 300,000 行 查询的最大操作行数 Select on too many rows 1,000,000 行 更新的最大操作行数 Update on too many rows 1,000,000 行 删除的最大操作行数 Delete on too many rows 1,000,000 行 创建索引时允许的表的最大行数 Create index on big table 500,000 行 修改表结构时允许的表的最大行数 Alter table on big table 500,000 行 警报阈值百分比 无 80% 表主键及聚簇索引奖励系数 无 1024 倍 =============================== =========================================== =============== RDC 的预判和拦截是针对 Web 应用的使用场景来优化的,如果您的数据库表结构、索引、SQL 语句等合理的话是不会触发这些拦截的,相反,如果出现这些拦截,您就需要根据对应的错误码以及其优化建议对你的数据库或者 SQL 语句去做相应的优化。 以下是被 RDC 拦截返回的错误码说明以及建议: +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |错误码| 错误信息 | 说明 | 建议 | +======+=======================================+================================+======================================================+ |13000 | Not support multi statements | 不支持一个字符串多条 SQL 语句 | 无 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13001 | Select on too many rows | 查询的表记录超过了限制 [1]_ | 优化 SQL 语句,减少扫描行 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13002 | Update on too many rows | 更新的表记录超过了限制 [1]_ | 优化 SQL 语句,减少扫描行 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13003 | Delete on too many rows | 删除的表记录超过了限制 [1]_ | 减少 SQL 语句,减少扫描行 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13004 | Create index on big table | 在一个过大的表上创建索引 | 使用新浪云 DefferedJob 离线任务队列执行 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13005 | Alter table on big table | 在一个过大的表上改变表结构 | 使用新浪云 DefferedJob 离线任务队列执行 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13006 | Operations take too much time cost | 超过 SQL 并发执行时间和 | 优化 SQL 语句,或者购买更大的并发支持 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13007 | Filesort on too many rows | SQL 导致高时间复杂度的外排序 | 优化 SQL 语句 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13008 | Table has too many rows | 单表行数超过规定上限 | 分表以降低表内的记录数 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13009 | Database has too many tables | 用户当前表数目已达到规定上限 | 降低表的数量(可以通过 MySQL 的跨应用授权使用多库) | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13010 | Not support table type | 试图创建不支持的表类型 | 了解支持的表类型 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13011 | Not support table optimization | 试图执行 optimize table 语句 | 去掉该语句 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13012 | Not support function | 试图执行禁用函数 | 不执行该函数 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13013 | Scanned too many databases when | 查询 INFORMATION_SCHEMA | | | | querying INFORMATION_SCHEMA | 时导致过多的跨库扫描 | 查询时 INFORMATION_SCHEMA 时显式指明库和表 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13014 | Too complicated sql case uncacheable | 过于复杂的语句导致不可被 cache | 降低语句复杂度 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13016 | Not support show databases | 不支持 show databases | 不要调用 show databases | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13017 | Select on too many rows without index | 查询时过于复杂且不带索引 | 请使用索引查询 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13018 | Impossible where that may | 出现永远不可能的条件语句 | | | | caused by sql injection | 有可能是被 SQL 注入导致 | 检查该语句是否有安全隐患 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13019 | Invalid operate information_schema | 对 information_schema 操作不当 | 避免对 information_schema 的操作 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13044 | Backends connection error | 连接时出现未知错误 | 稍后重试,连续失败时,请向官方反馈 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13045 | Backends connection timeout | 连接时超时 | 稍后重试,连续失败时,请向官方反馈 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13046 | No available backends | 没有可用的后端 | 向官方反馈 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ |13047 | Be banned (maybe out of quota) | 因为慢查询过多导致被禁用 | 优化 SQL 语句 | +------+---------------------------------------+--------------------------------+------------------------------------------------------+ .. [1] 扫描行数过多,这里的考虑因素有表结构、表行数、带没带索引、有没有 limit、有没有 join 等 共享 MySQL 服务对用户开放了以下权限: :: select, insert, update, delete, create table, alter table, drop table, index 新建 ========== 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL』进入创建页面。选择你要创建的数据库类型开始创建。 .. image:: /images/rdc-create.png 导入、导出 ===================== **导入** 1. 上传数据库文件到 Storage 中。 2. 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导入任务。 3. 导入成功后,可以在管理面板收到任务执行成功通知。 **导出** 1. 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导出任务。 2. 导出成功后,可以在管理页面收到任务执行成功通知。您可以在通知提供的链接中下载导出的数据库文件。 .. note:: - 导入导出任务不一定立刻执行,但一般会在第二天凌晨 1 点~7 点间完成。导入压缩文件时,请保证解压后只有一个解压文件,且没有文件夹,否则任务会执行失败。 - 对于 4M 以内的小数据,您可以直接通过 PhpMyAdmin 在线同步的导入导出。 - 导入导出任务也可以通过 API 去添加,相关的 API 见: `PHP `_ , :py:mod:`Python ` 备份、恢复 ================ 共享数据库服务会每天定时自动帮您备份数据库,您可以在控制台管理页面导航中点击[数据库服务 > MySQL > 共享 MySQL 服务 > 数据恢复]进入管理面板中恢复数据库到最近 14 天内任意时间点。 .. image:: /images/rdc-recovery.png 跨应用授权 ================ 您可以在管理面板中授权其它应用访问你的数据库。