新浪云

电脑版
提示:原网页已由神马搜索转码, 内容由www.sinacloud.com提供.

共享 MySQL

服务概述

共享 MySQL 服务是新浪云基于 MySQL-5.6 开发的一个共享数据库服务,您仅需几秒钟即可获得一个包括主从节点、高可用服务、自动备份、在线扩容以及监控等各种管理功能的 MySQL 服务。

不同于 独享MySQL,创建一个共享 MySQL 数据库并不会创建新的 mysql-server(mysqld)实例,而只是在已有的 mysql-server 集群里选择一个实例,然后在这个实例上调用 CREATEDATABASEapp_$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]
()扫描行数过多,这里的考虑因素有表结构、表行数、带没带索引、有没有 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

跨应用授权

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

API使用手册

新浪云的PHP运行环境提供了标准的 MySQLMySQLIPDO模块来连接数据库,支持所有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标准写法