mysql> create table user2 select name,uid,gid from user limit 3;
mysql> create table info select name,uid,homedir,shell from user limit 5;
show tables;
create or replace view v1
as select
a.name as aname ,
b.name as bname ,
a.uid as auid ,
b.uid as buid
from user2 a left join info b on a.uid=b.uid;
mysql> create view v2 as select a1.username as aname ,b1.username as bname,a1.uid as auid, b1.uid as buid from a a1 left join b b1 on a1.username=b1.username and a1.uid=b1.uid;
select * from v4;
mysql> create or replace view v2 as select * from user;
select * from v2; select
create view
v1
as
select x,x,x from 表/ 视图
[with local/cascade check option];
create table a select * from user where uid < 10;
select * from a;
create view va1
as
select * from a
where uid < 8 with check option;
create view va2
as
select * from va1
where uid >=5
with local check option;
create view va3
as
select * from va1
where uid >=5
with cascaded check option;
对创建的试图va1 va2 va3 插入或更新记录的操作。验证限制。
+++++++++++++++++++++++++++++++++
创建名称为say的存储过程,功能查看db9库下user表的前10记录信息。
mysql> delimiter //
mysql> create procedure say()
begin
select * from db9.user where id<=10;
end
//
mysql> delimiter ;
调用存储过程
mysql> call say;
mysql> call say();
查看存储过程
mysql> show procedure status\G;
mysql>
select db,name,type from mysql.proc
where name="say2"\G;
mysql> show create procedure say;
drop procedure say;
参数类型
mysql> delimiter //
mysql> create procedure say2(
IN username char(20),
IN x int(2)
)
begin
select * from db9.user where name="@username" and uid=@x;
end
//
mysql> delimiter ;
call say2("tom",19)
call say2("lucy",30)
++++++++++++++++++++++++++++
mysql> delimiter //
mysql> create procedure say2( in username char(10) )
-> begin
-> select username;
-> select * from db9.user where name=username;
-> end
-> //
Query OK, 0 rows affected (0.06 sec)
mysql> delimiter ;
mysql> call say2;
mysql> call say2("bin");
mysql> call say2("mysql");
定义局部变量
delimiter //
create procedure say5()
begin
declare x int default 11;
select x;
select sum(uid) into x from user where uid<=100;
select x;
end
//
delimiter ;
call say3; //因为没有参数所以可以不加()
delimiter //
create procedure say5(
in bash char(20),
in nologin char(25),
out x int ,
out y int
)
begin
declare z int ;
set z=0;
select count(name) into @x from db9.user where shell=bash;
select count(name) into @y from db9.user where shell=nologin;
set z=@x+@y;
select z;
end
//
delimiter ;
call say5("/bin/bash","/sbin/nologin",@x,@y);
delimiter //
create procedure say6(in x int(1) )
begin
if x <= 10 then
select * from db9.user where id <=x;
end if;
end
//
delimiter ;
call say6(11);
call say(5);
delimiter //
create procedure say10(in x int(1) )
begin
if x <= 10 then
select * from db9.user where id <= x;
end if;
end
//
delimiter ;
delimiter //create procedure p1(in x int(1) )
begin
if x is null then
set @x = 1;
select * from db9.user where id=x;
end if;
if x <= 10 then
select * from db9.user where id <=x;
end if;
end
//
delimiter ;+++++++++++++++++++++++++++++
delimiter //create procedure p2(in x int(1) )
begin
if x is null then
set @x = 1;
select * from userdb.user where id=x;
else
select * from userdb.user where id <=x;
end if;
end
//
delimiter ;
delimiter //
create procedure p7(in x char(10) )
begin
if x is null then
set @x = "mysql";
select @x;
select * from db9.user where name=@x;
else
select * from db9.user where name=x ;
select * from db9.user where name=@x ;
end if;
end
//
delimiter ;
call p7(null);
call p7("bin");
+++++++++++++++++++++++++++++++++++++++++
循环结构
----while循环结构例子-------------------
//输出数字1到5;
drop procedure say;
delimiter //
create procedure p24()
begin
declare i int;
set i=1;
while i <= 5 do
select i;
set i=i+1;
end while;
end
//
delimiter ;
call p24();
---------------loop 死循环的例子-------------------
drop procedure say;
delimiter //
create procedure say()
begin
declare i int;
set i=1;
loop
select i;
set i=i+1;
end loop;
end
//
delimiter ;
call say();
---------------------定义标签名称 条件匹配时 结束循环--------------------
delimiter //
create procedure p259()
begin
declare i int;
set i=0;
loab1:loop
set i=i+1;
if i = 5 then
ITERATE loab1;
end if;
if i = 11 then
LEAVE loab1;
end if;
select i;
end loop;
end
//
delimiter ;
drop procedure say;
delimiter //
create procedure say()
begin
declare i int;
set i=1;
loab1:loop #给loop循环定义标签名称为 loab1
select i;
set i=i+1;
if i=3 then #变量i的值加到3的时候 结束循环
LEAVE loab1;
end if;
end loop;
end
//
----------------------定义标签名称 条件匹配时 结束当前循环 执行下一次循环--------------------
mysql> drop procedure say;
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> create procedure say() #输出数字1到6 但不输出数字3
-> begin
-> declare i int;
-> set i=1;
-> loab1:loop
-> select i;
-> set i=i+1;
-> if i=3 then #i值是3时结束本次循环
-> iterate loab1;
-> end if;
-> if i=7 then #i值是7时 结束循环
-> leave loab1;
-> end if;
-> end loop;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call say();
---------------------------使用repeat循环输出数字1到5-----------------------
delimiter //
create procedure p260()
begin
declare i int;
set i=1;
repeat
select i;
set i=i+1;
until i=6
end repeat;
end
//
delimiter ;
call p260();
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
drop procedure say;
delimiter //
create procedure say()
begin
declare i int;
set i=1;
repeat
select i;
set i=i+1;
until i=6
end repeat;
end
//
delimiter ;
-------------------一起向表中插入10条记录--------------------
delimiter //
create procedure adddata()
begin
declare n int default 0;
while n<10
do
insert into studydb.user(name,uid) values("bob",888);
set n = n+1;
end while;
end
//
mysql> call adddata();
mysql> select name,uid from user where name="bob" and uid=888;
----------------------自定义插入记录的行数--------------------------
drop procedure say;
delimiter //
create procedure say(in num int(2) )
begin
declare i int;
set i=1;
while i <= num do
insert into userdb.user(name,gid)values("bob",i);
set i=i+1;
end while;
end
//
mdelimiter ;
call say(3);
mysql> select * from user where name="bob"; #查看是否插入记录
+----+------+------+----------+------+------+---------+---------+-------+
| id | name | sex | password | pay | gid | comment | homedir | shell |
+----+------+------+----------+------+------+---------+---------+-------+
| 45 | bob | boy | NULL | NULL | 1 | NULL | NULL | NULL |
| 46 | bob | boy | NULL | NULL | 2 | NULL | NULL | NULL |
| 47 | bob | boy | NULL | NULL | 3 | NULL | NULL | NULL |
+----+------+------+----------+------+------+---------+---------+-------+
3 rows in set (0.00 sec)
++++++++++++++++++++++++编辑配置文件
[root@localhost ~]# cat /usr/local/mycat/conf/server.xml #定义连接客户端连接mycat服务使用的用户名和密码及逻辑库的名字
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
<property name="processors">32</property> <property name="processorExecutor">32</property>
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
</system>
<user name="test"> #连接mycat服务时使用的用户名 test
<property name="password">test</property> #使用test用户连接mycat用户时使用的密码
<property name="schemas">TESTDB</property> #连接上mycat服务后,可以看到的库名多个时,使用逗号分隔 (是逻辑上的库名)
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> #定义只读权限,使用定义的user用户连接mycat服务后只有读记录的权限
</user>
<!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property>
<property name="weight">1</property> </node> </cluster> -->
<!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property>
</host> </quarantine> -->
</mycat:server>
[root@localhost ~]#
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[root@localhost ~]# cat /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> #逻辑库名 要与server.xml定义的一样
<table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" /> #定义分片的表
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2" /> #定义分片的表
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> #定义分片的表
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2" rule="mod-long" /> #定义分片的表
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> #定义分片的表
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> #定义分片的表
</schema>
<dataNode name="dn1" dataHost="c1" database="db1" />
#定义分片使用的库,所在的物理主机 ,真正存储数据的db1库在物理主机c1上
<dataNode name="dn2" dataHost="c2" database="db2" />
#定义分片使用的库,所在的物理主机 ,真正存储数据的db2库在物理主机c2上
#指定c1名称主机对应的ip地址
<dataHost name="c1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" >
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.4.55:3306" user="admin"
password="123456"> #访问数据时 mycat服务连接数据库服务器时使用的用户名和密码
</writeHost>
</dataHost>
#指定c2名称主机对应的ip地址
<dataHost name="c2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" >
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="192.168.4.54:3306" user="admin"
password="123456"> #访问数据时 mycat服务连接数据库服务器时使用的用户名和密码
</writeHost>
</dataHost>
</mycat:schema>
[root@localhost ~]#
++++++++++++++++++++启动服务
[root@localhost ~]# sed -n '4,5p' /usr/local/mycat/conf/wrapper.conf
# Java Application
wrapper.java.command=java
[root@localhost ~]#
[root@localhost ~]# which java
/usr/bin/java
[root@localhost ~]#echo "export PATH=/usr/local/mycat/bin" >> /etc/profile
[root@localhost ~]#source /etc/profile
[root@localhost ~]# mycat --help
Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump }
[root@localhost ~]#
[root@localhost ~]# mycat start
Starting Mycat-server...
[root@localhost ~]#
[root@localhost ~]# netstat -utnalp | grep :8066
tcp6 0 0 :::8066 :::* LISTEN 4524/java
[root@localhost ~]#
++++++++++++++++++++++++测试MyCAT
[root@room9pc17 ~]# mysql -h192.168.4.56 -P8066 -utest -ptest //客户端连接mycat服务器,存储数据
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| employee |
| goods |
| hotnews |
| travelrecord |
+------------------+
6 rows in set (0.00 sec)
MySQL [TESTDB]> MySQL [TESTDB]> create table employee( id int not null primary key, name varchar(100), sharding_id int not null );
MySQL [TESTDB]> MySQL [TESTDB]> insert into employee(id,name,sharding_id)values(1,"bob",10000),(2,"lucy",10010),(3,"alice",10000),(4,"jerry",10010);
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| c1 |
+------------+
1 row in set (0.00 sec)
mysql> select * from employee;
Empty set (0.00 sec)
mysql> select * from employee;
+----+-------+-------------+
| id | name | sharding_id |
+----+-------+-------------+
| 1 | bob | 10000 |
| 3 | alice | 10000 |
+----+-------+-------------+
2 rows in set (0.00 sec)
mysql>
++++++++++++++++++++++++++++++++++++++++++++++
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| c2 |
+------------+
1 row in set (0.00 sec)
mysql> select * from employee;
Empty set (0.00 sec)
mysql> select * from employee;
+----+-------+-------------+
| id | name | sharding_id |
+----+-------+-------------+
| 2 | lucy | 10010 |
| 4 | jerry | 10010 |
+----+-------+-------------+
2 rows in set (0.00 sec)
mysql>