Table of Contents

上一个主题

Memcached

下一个主题

独享MySQL

本页

共享 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』进入创建页面。选择你要创建的数据库类型开始创建。

../../_images/rdc-create.png

导入、导出

导入

  1. 上传数据库文件到 Storage 中。
  2. 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导入任务。
  3. 导入成功后,可以在管理面板收到任务执行成功通知。

导出

  1. 在控制台管理页面导航中点击『数据库与缓存/共享 MySQL/导入导出』进入异步任务创建页面,添加新的导出任务。
  2. 导出成功后,可以在管理页面收到任务执行成功通知。您可以在通知提供的链接中下载导出的数据库文件。

注解

  • 导入导出任务不一定立刻执行,但一般会在第二天凌晨 1 点~7 点间完成。导入压缩文件时,请保证解压后只有一个解压文件,且没有文件夹,否则任务会执行失败。
  • 对于 4M 以内的小数据,您可以直接通过 PhpMyAdmin 在线同步的导入导出。
  • 导入导出任务也可以通过 API 去添加,相关的 API 见: PHP , Python

备份、恢复

共享数据库服务会每天定时自动帮您备份数据库,您可以在控制台管理页面导航中点击[数据库服务 > MySQL > 共享 MySQL 服务 > 数据恢复]进入管理面板中恢复数据库到最近 14 天内任意时间点。

../../_images/rdc-recovery.png

跨应用授权

您可以在管理面板中授权其它应用访问你的数据库。