OceanBaseSQL用户手册参考word.docx
- 文档编号:16166325
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:33
- 大小:237.37KB
OceanBaseSQL用户手册参考word.docx
《OceanBaseSQL用户手册参考word.docx》由会员分享,可在线阅读,更多相关《OceanBaseSQL用户手册参考word.docx(33页珍藏版)》请在冰点文库上搜索。
OceanBaseSQL用户手册参考word
OceanBaseSQL用户手册
编号
文档版本
修订章节
修订原因
修订日期
修订人
1
0.1
新建文档
2012/10/16
竹翁
2
0.2
添加0.4.1版本新特性
2013/1/13
竹翁
3
0.3
细节说明;添加SELECTFORUPDATE说明;说明事务中SELECT的BUG陷阱
2013/1/21
竹翁
4
0.4
陷阱和缺陷添加对varchar(32)的说明;
陷阱和缺陷添加REPLACE返回affected_rows的说明;
附录中添加PS语句API示例程序
2013/1/23
竹翁
5
0.5
4.1,5.1
SQL语句大小写不敏感;双引号转义说明;新增altertable语句
2013/3/14
竹翁
6
0.6
4.2
增加对返回类型的描述
2013/3/22
方戟
1.OceanBase介绍
OceanBase是一个由RootServer,UpdateServer,ChunkServer,MergeServer等角色组成的分布式数据库系统。
RootServer是管理服务器,用于管理UpdateServer、ChunkServer和MergeServer等。
ChunkServer是OceanBase的基线数据存储子系统,由多台机器构成,基线数据通常保存2~3副本并且保存在不同的ChunkServer上。
UpdateServer是OceanBase的增量更新子系统,记录用户的修改,通常由一主一备或一主多备构成。
MergeServer是OceanBase的用户接口子系统,接收用户的查询请求,并从对应ChunkServer上获得基线数据以及从UpdateServer上获得更新的增量,然后融合二者后返回用户。
SQL用户只需要和MergeServer交互,每一个MergeServer都可以视为一个SQL服务器。
用户连接任何一台MergeServer都可以对全部表格数据执行SQL语句。
2.快速上手
OceanBase完全兼容MySQL的网络协议,SQL用户可以使用mysql终端客户端、以及使用libmysqlclient的任意程序连接OceanBase。
只要你熟悉mysql,那么你就可以直接使用OceanBaseSQL服务了。
下面我们以mysql终端客户端为例演示一下。
步骤一
请询问你的OceanBaseDBA任意一台MergeServer的IP地址和SQL服务端口(默认端口号是2828)。
@TODO改用LD_PRELOAD=libobsql.so启动mysql的方式
步骤二
使用mysql终端连接MergeServer,如下图。
注意红色部分,如果你看到类似这样的字样,说明你已经成功登陆了OceanBase!
像使用MySQL一样体验一下吧。
步骤三
我们下面可以创建一个表格,插入一些数据,然后查询出来。
很简单,是不是:
)
3.使用API
3.1.C程序
OceanBase为应用程序提供了libobsql函数库。
这个库在二进制接口上与mysql的libmysqlclient库完全兼容。
也就是说,一个程序(例如mysql,mysqltest等)之前用libmysqlclient编译好,使用PRELOAD技术无需重新编译就可以使用来连接OceanBase。
应用程序可以使用与libmysqlclient提供的API(mysql.h)完全相同的接口直接访问OceanBaseSQL服务。
下面是一个简单的例子程序的完整清单。
#include
#include
#include
intmain(intargc,char*argv[])
{
(void)argc;
(void)argv;
constchar*HOST="127.0.0.1";
intPORT=2828;
//1.初始化libmysqlclient
if(0!
=mysql_library_init(0,NULL,NULL))
{
fprintf(stderr,"couldnotinitmysqllibrary\n");
exit
(1);
}
MYSQLmy_;
ASSERT_TRUE(NULL!
=mysql_init(&my_));//此处用ASSERT省略错误检查
fprintf(stderr,"Connectingserver%s:
%d...\n",HOST,PORT);
//2.连接OceanBaseSQL服务
ASSERT_TRUE(NULL!
=mysql_real_connect(&my_,HOST,"","","test",PORT,NULL,0));
//3.建表
intret=0;
ret=mysql_query(&my_,"droptableifexistsob_new_sql_test");
if(0!
=ret)
{
fprintf(stderr,"%s\n",mysql_error(&my_));
}
ASSERT_EQ(0,ret);
ret=mysql_query(&my_,"createtableifnotexistsob_new_sql_test"
"(c0varchar(64),c1intprimarykey,c2int,"
"c3int,c4int,c5int,c6int,"
"c7int,c8int,c9int,c10int,"
"c11int,c12int,c13int,c14int,"
"c15int)");
if(0!
=ret)
{
fprintf(stderr,"%s\n",mysql_error(&my_));
}
ASSERT_EQ(0,ret);
//4.插入数据
ret=mysql_query(&my_,"insertintoob_new_sql_test(c0,c1,c2)values('hello',1,2)");
if(0!
=ret)
{
fprintf(stderr,"%s\n",mysql_error(&my_));
}
ASSERT_EQ(0,ret);
//5.查询数据
ASSERT_EQ(0,mysql_query(&my_,"select*fromob_new_sql_test"));
MYSQL_RES*res=mysql_use_result(&my_);//取结果集
ASSERT_TRUE(NULL!
=res);
unsignedintnum_fields=mysql_num_fields(res);//结果列数
ASSERT_EQ(16U,num_fields);
unsignedlong*lengths=NULL;
MYSQL_ROWrow;
row=mysql_fetch_row(res);
ASSERT_TRUE(NULL!
=row);
lengths=mysql_fetch_lengths(res);//row中每个值的长度,0表示NULL
ASSERT_TRUE(NULL!
=lengths);
for(unsignedintj=0;j { if(0! =j) { fprintf(stdout,","); } fprintf(stdout,"%.*s",row[j]? static_cast : static_cast row[j]: "NULL"); } fprintf(stdout,"\n"); row=mysql_fetch_row(res); ASSERT_TRUE(NULL==row);//nomorerows mysql_free_result(res); //6.删表 ret=mysql_query(&my_,"droptableifexistsob_new_sql_test"); if(0! =ret) { fprintf(stderr,"%s\n",mysql_error(&my_)); } //7.destroy mysql_library_end(); return0; } 恭喜你,你已经完成了一个从OceanBase中读写数据的程序。 关于API的完整说明,请参考MySQLCAPI文档。 3.1.1.编译方法一: 首先,需要保证你的开发机上已经安装了mysql应用开发包,在RHEL或者fedora上可以使用如下命令安装: @TODOobsql如何安装 yuminstallmysql-devel 然后,拷贝上面的程序到一个文件ob_sql_example.cpp中,用如下命令编译: g++-oob_sql_exampleob_sql_example.cpp–lmysqlclient 程序编译好后,用下面的命令运行: LD_LIBRARY_PATH= 3.1.2.编译方法二: 你也可以在编译的时候直接使用libobsql代替libmysqlclient,这样产生的可执行程序无需使用LD_PRELOAD的方式来执行。 应用程序源码不需要任何修改,还是包含mysql.h和使用其中的API。 @TODO补充libobsql执行示例的环境变量设置和头文件的 g++-oob_sql_exampleob_sql_example.cpp–lobsql ./ob_sql_example 3.2.Java程序 OceanBase提供了符合Java标准的DataSource,OBGroupDataSource是javax.sql.DataSource的一个实现,Java应用程序可以使用OBGroupDataSource获得与OceanBase服务器交互的连接。 这个库在mysql-connector-java的基础上,实现了OceanBase多集群间流量分配,多MergeServer间的负载均衡,以及在单个MergeServer发生失效的情况下自动进行切换容灾等功能。 下面是一个简单的例子程序的完整清单。 @TODOJavaPS的例子 packagecom.alipay.oceanbase; importjava.io.*; importjava.util.*; importjava.sql.*; importjavax.sql.DataSource; importcom.alipay.oceanbase.OBGroupDataSource; publicclassObJDBCExample { publicstaticvoidmain(String[]argv) { try{ //initthedatasource OBGroupDataSourceds=newOBGroupDataSource(); List instanceList.add("10.232.36.185: 45447");//OceanBaseRootServer ds.setInstanceList(instanceList);//推荐使用setConfigURL的方式,见后 ds.setUserName("user"); ds.setPasswd("password"); ds.init(); //JDBCstuff Connectionconn=ds.getConnection(); Statementstmt=conn.createStatement(); stmt.executeUpdate("droptableifexistst1"); stmt.executeUpdate("createtablet1(c1intprimarykey,c2varchar)"); stmt.executeUpdate("insertintot1values(1,'helloob'),(2,'hellojava')"); ResultSetrs=stmt.executeQuery("select*fromt1"); ResultSetMetaDatarsmd=rs.getMetaData(); intcolumnCount=rsmd.getColumnCount(); System.out.println("columncount="+columnCount); while(rs.next()){ System.out.println(rs.getInt("c1")+"|"+rs.getString("c2")); } System.out.println("finish"); } catch(SQLExceptionex){ System.out.println(ex); } catch(Exceptionex){ System.out.println(ex); } } } Java程序也可以通过Spring等框架来使用OBGroupDataSource。 例如使用SpringJdbcTemplate: OBGroupDataSourceds=newOBGroupDataSource(); ds.setUserName("user"); ds.setPasswd("pass"); ds.setDbName("test"); ds.setConfigURL("http: //10.232.102.182: 8080/diamond-server/config.co? dataId=xxx");//这个URL由OceanBase服务方提供 ds.init(); JdbcTemplatejtp=newJdbcTemplate(); jtp.setDataSource(ds); Stringsql="select1fromdual"; intret=jtp.queryForInt(sql); 通过Bean使用的Spring配置: //10.232.102.182: 8080/diamond-server/config.co? dataId=xxx"/> OBDataSource库主要的maven依赖关系如下(请在你的pom.xml中添加): 4.陷阱和缺陷 4.1.支持的语句 OceanBaseSQL语法在参考MySQL的语法同时,尽量遵循SQL92标准,在必要的时候还参考了Oracle。 SQL语句中的关键字,以及表名、列名、函数名等都是大小写不敏感的。 表名和列名都转换为小写之后存入schema中。 所以,即使用户建表时候列名是大写的,查询的时候获得的列名也是小写。 遵循SQL92标准,字符串字面量要用单引号表示,见5.2.1.7。 而双引号扩住的名字被解释为表名、列名或函数名,而不是字符串。 双引号内可以出现SQL保留的关键字。 OceanBase没有database的概念,可以理解为一个oceanbase集群只有一个database,所以用户不需要也不能使用usedatabase语句来指定database。 目前版本支持的语句有createtable,droptable,select,insert,replace,delete,update,set,show等,具体语法请见SQL语法参考。 权限控制等管理语句参考《OceanBaseSQL管理员手册》。 4.2.数据类型 OceanBase不支持time,date类型,只支持datetime和timestamp类型(这两者等价)。 用户可以使用datetime,timestamp类型的字面量(literal,见5.2.1.6)。 OceanBase暂不支持decimal类型,将在下一个版本提供。 OceanBase提供了两个特殊的数据类型: Createtime类型的列中记录本行数据第一次插入时的时间,由系统自动维护,用户不能直接修改;Modifytime类型的列中记录本行数据最近一次被修改的时间,由系统自动维护,用户不能直接修改。 这两个类型的列也不能作为主键的组成部分。 OceanBase没有字符集的概念。 Char,Varchar,Binary,Varbinary在OceanBase内部都存储为不解释内容的二进制变长字符串,类似于Varbinary。 这种类型的比较使用的是字节序。 此外,Createtable时定义的varchar列的最大长度也是不起作用的。 例如varchar(32),实际上可以插入大于32字节的串,不认为是错误。 在OceanBase内部,Tinyint,Smallint,Mediumint,Int,Integer,Bigint无论语义还是实现都是等价的,存储为8字节有符号整型,即int64_t。 OceanBase支持float和double浮点数类型,分别表示4字节和8字节的浮点数,其语义等同于IEEE754浮点数。 OceanBase返回给客户端的数据类型目前只可能是如下几种,客户端在绑定变量的时候需要特别注意。 DataType MySQLDataType int MYSQL_TYPE_LONGLONG float MYSQL_TYPE_FLOAT double MYSQL_TYPE_DOUBLE datetime MYSQL_TYPE_DATETIME string MYSQL_TYPE_VAR_STRING bool MYSQL_TYPE_TINY decimal MYSQL_TYPE_NEWDECIMAL 4.3.浮点数 在MySQL中,型如“1.2345”的字面量是作为decimal类型处理的,型如“1.2345e18”的字面量才作为浮点数处理。 而目前版本的OceanBase中,两者都作为浮点数类型double处理。 在MySQL中,在做表达式运算时,两个整数类型相除,结果是decimal类型。 而目前版本的OceanBase中,两者相除的结果为double类型。 4.4.函数 OceanBase遵循SQL标准,不支持MySQLCOUNT(DISTINCTexpr,expr,[expr...])的语法,即聚集函数中只能出现一个value表达式,不支持多个(例如count(distinctc1,c2))。 OceanBase目前支持的系统函数非常有限,只有length、substr、cast、current_time、current_date、current_timestamp、trim、lower、upper、coalesce等。 我们会根据用户的需求优先级不断添加新的函数。 4.5.Join的限制 目前,Join不支持USING子句,见后面的Join语法。 并且,Join的连接条件中必须至少有一个等值连接条件。 例如,下面的两个例子是支持的: select*fromt1innerjoint2ont1.c1=t2.c1andt1.c2<1000; select*fromt1,t2wheret1.c1=t2.c1andt1.c2<1000; 而下面的语句是不支持的: select*fromt1innerjoint2ont1.c1>t2.c1andt1.c2<1000; 4.6.update和delete的限制 目前,update和delete语句必须指定primarykey的所有列作为限制条件,并且只支持单行。 换言之,update、delete操作必须指定单行的主键。 例如 createtablet1(c1int,c2int,c3int,primarykey(c1,c2)); deletefromt1wherec1=1andc2=2; updatesetc3=c1+1wherec1=1andc2=2; 而下面的语句都是不支持的: deletefromt1; deletefromt1wherec1=1; updatesetc3=c1+1; updatesetc3=c1+1wherec1>1andc2>2; 4.7.事务中SELECT的BUG 目前在事务中(starttransaction或者begin开启事务)执行SELECT语句,是不能读取当当前事务中未提交的数据的。 这是一个已知的功能BUG。 用户如果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OceanBaseSQL 用户手册 参考 word
![提示](https://static.bingdoc.com/images/bang_tan.gif)