共享 MySQL¶
服务概述¶
共享 MySQL 服务是新浪云基于 MySQL-5.6 开发的一个共享数据库服务,您仅需几秒钟即可获得一个包括主从节点、高可用服务、自动备份、在线扩容以及监控等各种管理功能的 MySQL 服务。
不同于 独享MySQL ,创建一个共享 MySQL 数据库并不会创建新的 mysql-server(mysqld) 实例,而只是在已有的 mysql-server 集群里选择一个实例,然后在这个实例上调用 CREATE DATABASE app_$APPNAME
创建一个新的 database 供您使用。
主从架构
共享 MySQL 数据库采用主从架构,当数据库发生故障或延迟时,系统会在秒级内自动切换,保证服务稳定可靠。
MySQL 从库有时候会因为网络抖动或者用户 SQL 语句不够优化,导致从库数据同步会有些微延时(3-10 秒)。如果您有对数据实时性要求比较高的查询,建议在主库上进行操作。
性能
共享 MySQL 数据库可以支持最高百万级的数据库访问,对于数据库性能要求更高的应用建议使用 独享MySQL 。
MySQL 存储引擎
共享 MySQL 数据库服务支持 MyISAM 和 InnoDB 引擎,目前 InnoDb 引擎仅对企业版开放,详见 企业版介绍 。
安全和隔离
共享 MySQL 数据库服务通过 RDC(我们为共享数据库服务开发的高性能 MySQL 代理)和 MySQL 本身的认证机制来实现数据库和数据库之间的隔离。所有的数据库连接会首先连接 RDC,在 RDC 认证通过之后,由 RDC 将连接代理给实际的后端数据库。
RDC 的功能主要如下:
- 通过其强隔绝性为数据库提供更高的安全性,保障您的数据安全。
- 通过预判用户执行的 SQL 语句,提前拦截可能损伤系统的 SQL 语句。
RDC 会对所有的 SQL 语句执行以下预判,如果超过了其限制,RDC 会直接拦截这个 SQL 查询,返回查询错误,您可以根据 MySQL 错误码判断该请求是否是被 RDC 拦截以及拦截的原因。
预判条件 | 相关错误信息 | 限额 |
---|---|---|
单表的最大行数 | 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 querying INFORMATION_SCHEMA | 查询 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] | (1, 2, 3) 扫描行数过多,这里的考虑因素有表结构、表行数、带没带索引、有没有 limit、有没有 join 等 |
共享 MySQL 服务对用户开放了以下权限:
select, insert, update, delete, create table, alter table, drop table, index
新建¶
在控制台管理页面导航中点击『数据库与缓存/共享 MySQL』进入创建页面。选择你要创建的数据库类型开始创建。
导入、导出¶
导入
- 上传数据库文件到 Storage 中。
- 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导入任务。
- 导入成功后,可以在管理面板收到任务执行成功通知。
导出
- 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导出任务。
- 导出成功后,可以在管理页面收到任务执行成功通知。您可以在通知提供的链接中下载导出的数据库文件。
备份、恢复¶
共享数据库服务会每天定时自动帮您备份数据库,您可以在控制台管理页面导航中点击[数据库服务 > MySQL > 共享 MySQL 服务 > 数据恢复]进入管理面板中恢复数据库到最近 14 天内任意时间点。
跨应用授权¶
您可以在管理面板中授权其它应用访问你的数据库。
API使用手册¶
新浪云的PHP运行环境提供了标准的 MySQL 、 MySQLI 和 PDO 模块来连接数据库,支持所有MYSQL的特性,您可以使用您习惯的方式来操作数据库。
以下是一些和共享MySQL数据库服务相关的预定义常量,你可以直接引用这些参数来连接数据库:
用户名 : SAE_MYSQL_USER
密 码 : SAE_MYSQL_PASS
主库域名 : SAE_MYSQL_HOST_M
从库域名 : SAE_MYSQL_HOST_S
端 口 : SAE_MYSQL_PORT
数据库名 : SAE_MYSQL_DB
使用方法,以MySQL模块为例:
<?php
// 连主库
$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
// 连从库
// $db = mysql_connect(SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
if ($db) {
mysql_select_db(SAE_MYSQL_DB, $db);
// ...
}
?>
注解
PDO不支持host:port这种写法,请使用PDO标准写法