MySQL之MyCat Mycat 可以简单概括为
⼀个彻底开源的,⾯向企业应⽤开发的⼤数据库集
⽀持事务、ACID、可以替代MySQL的加强版数据库
⼀个可以视为MySQL集的企业级数据库,⽤来替代昂贵的Oracle集
⼀个融合内存缓存技术、NoSQL技术、HDFS⼤数据的新型SQL Server
结合传统数据库和新型分布式数据仓库的新⼀代企业级数据库产品
⼀个新颖的数据库中间件产品
Mycat⼯作原理
Mycat的原理中最重要的⼀个动词是"拦截",它拦截了⽤户发送过来的SQL语句,⾸先对SQL语句做了⼀
些特定的分析:如分⽚分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数
据库,并将返回的结果做适当的处理,最终再返回给⽤户
Mycat应⽤场景
Mycat适⽤的场景很丰富,以下是⼏个典型的应⽤场景
单纯的读写分离,此时配置最为简单,⽀持读写分离,主从切换
分表分库,对于超过1000万的表进⾏分⽚,最⼤⽀持1000亿的单表分⽚
多租户应⽤,每个应⽤⼀个库,但应⽤程序只连接Mycat,从⽽不改造程序本⾝,实现多租户化
报表系统,借助于Mycat的分表能⼒,处理⼤规模报表的统计
替代Hbase,分析⼤数据
作为海量数据实时查询的⼀种简单有效⽅案,⽐如100亿条频繁查询的记录需要在3秒内查询出来结
果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的
选择
Mycat长期路线图
强化分布式数据库中间件的⽅⾯的功能,使之具备丰富的插件、强⼤的数据库智能优化功能、全⾯
的系统监控能⼒、以及⽅便的数据运维⼯具,实现在线数据扩容、迁移等⾼级功能
进⼀步挺进⼤数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速
的巨表关联、排序、分组聚合等 OLAP⽅向的能⼒,并集成⼀些热门常⽤的实时分析算法,让⼯程
师以及DBA们更容易⽤Mycat实现⼀些⾼级数据分析处理功能mysql怎么读英语
不断强化Mycat开源社区的技术⽔平,吸引更多的IT技术专家,使得Mycat社区成为中国的
Apache,并将Mycat推到Apache基⾦会,成为国内顶尖开源项⽬,最终能够让⼀部分志愿者成为
专职的Mycat开发者,荣耀跟实⼒⼀起提升
Mycat不适合的应⽤场景
设计使⽤Mycat时有⾮分⽚字段查询,请慎重使⽤Mycat,可以考虑放弃!
设计使⽤Mycat时有分页排序,请慎重使⽤Mycat,可以考虑放弃!
设计使⽤Mycat时如果要进⾏表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请
慎重使⽤Mycat,可以考虑放弃!
设计使⽤Mycat时如果有分布式事务,得先看是否得保证事务得强⼀致性,否则请慎重使⽤
Mycat,可以考虑放弃!
MyCat的⾼可⽤性:
需要注意: 在⽣产环境中, Mycat节点最好使⽤双节点, 即双机热备环境, 防⽌Mycat这⼀层出现单点故障.
可以使⽤的⾼可⽤集⽅式有:
Keepalived+Mycat+Mysql
Keepalived+LVS+Mycat+Mysql
Keepalived+Haproxy+Mycat+Mysql
mycat安装⽬录结构:
bin mycat命令,启动、重启、停⽌等
catlet catlet为Mycat的⼀个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引⽤的jar包,Mycat是java开发的
logs ⽇志⽂件,包括Mycat启动的⽇志和运⾏的⽇志
< mycat版本说明
logs⽬录:
wrapper.log mycat启动⽇志
mycat.log mycat详细⼯作⽇志
Mycat的配置⽂件都在conf⽬录⾥⾯,这⾥介绍⼏个常⽤的⽂件:
节点控制
Mycat 主要配置⽂件说明
存放Mycat软件本⾝相关的配置⽂件,⽐如:连接Mycat的⽤户,密码,数据库名称等
参数说明
user ⽤户配置节点
name 客户端登录MyCAT的⽤户名,也就是客户端⽤来连接Mycat的⽤户名。
password 客户端登录MyCAT的密码
schemas 数据库名,这⾥会和l中的配置关联,多个⽤逗号分开,例如:db1,db2
privileges 配置⽤户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false
注意:
mycat时使⽤的账号信息
逻辑库名(如上⾯的TESTDB,也就是登录mycat后显⽰的库名,切换这个库之后,显⽰的就是代理
的真实mysql数据库的表)要在l⾥⾯也定义,否则会导致mycat服务启动失败!
这⾥只定义了⼀个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的⽤
户名和密码,那么就需要在l⽂件中定义多个对应的库!
是最主要的配置项,此⽂件关联mysql读写分离策略,读写分离、分库分表策略、分⽚节点都是在此⽂
件中配置的.MyCat作为中间件,它只是⼀个代理,本⾝并不进⾏数据存储,需要连接后端的MySQL物理
服务器,此⽂件就是⽤来连接MySQL服务器的
参数说明
schema 数据库设置,此数据库为逻辑数据库,name与l中schema对应
dataNode 分⽚信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库
配置说明
name属性唯⼀标识dataHost标签,供上层的标签使⽤。
maxCon属性指定每个读写实例连接池的最⼤连接。也就是说,标签内嵌套的writeHost、readHost标
签都会使⽤这个属性的值来实例化出连接池的最⼤连接数
minCon属性指定每个读写实例连接池的最⼩连接,初始化连接池的⼤⼩
每个节点的属性逐⼀说明
schema:
属性说明
name 逻辑数据库名,与l中的schema对应
checkSQLschema 数据库前缀相关设置,这⾥为false
sqlMaxLimit select 时默认的limit,避免查询全表
table
属性说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点⽤逗号分隔。节点为下⽂dataNode设置的name
primaryKey 主键字段名,⾃动⽣成主键时需要设置
autoIncrement 是否⾃增
rule 分⽚规则名,具体规则下⽂rule详细介绍
dataNode
属性说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名
dataHost
属性说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的⽅式
writeType 写⼊⽅式
dbType 数据库类型
heartbeat ⼼跳检测语句,注意语句结尾的分号要加
型,⽬前的取值有 4 种:
balance="0":不开启读写分离机制,所有读操作都发送到当前可⽤的writeHost上,即读请求仅发送到
writeHost上
balance="1":⼀般⽤此模式,读请求随机分发到当前writeHost对应的readHost和standby的
writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语
句的负载均衡
balance="2":读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随
机的在writeHost、 readhost 上分发
balance="3":读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到
wiriterHost 对应的 readhost 执⾏, writerHost 不负担读压⼒,注意 balance=3 只在 1.4 及其以后版本
有,1.3 没有
writeHost和readHost 标签
在线网站生成器这两个标签都指定后端数据库的相关配置给mycat,⽤于实例化后端连接池。
唯⼀不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满⾜系统的要求。
在⼀个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,
那么这个writeHost绑定的所有readHost都将不可⽤。另⼀⽅⾯,由于这个writeHost宕机系统会⾃动的
检测到,并切换到备⽤的writeHost上去
注意:
Mycat主从分离只是在读的时候做了处理,写⼊数据的时候,只会写⼊到writehost,需要通过mycat的
主从复制将数据复制到readhost
案例:利⽤ MyCat 实现 MySQL 的读写分离
# 服务器共三台
mycat-server 172.31.0.48 #内存建议2G以上
mysql-master 172.31.0.28 MySQL 8.0
mysql-slave1 172.31.0.38 MySQL 8.0
# 关闭SELinux和防⽕墙
systemctl stop firewalld
setenforce 0
时间同步
# 创建 MySQL 主从数据库
[root@centos8 ~]# yum install mysql-server -y
1) 修改master和slave上的配置⽂件
# master上的myf
[root@centos8 ~]# vim /etc/myf
[mysqld]
server-id = 28
log-bin=/data/mysql/mysql-bin
# slave上的myf
[mysqld]
server-id = 38
2) Master上创建复制⽤户
mysql> create user 'repluser'@'172.31.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
# 授权
mysql> grant replication slave on *.* to repluser@'172.31.0.%';
Query OK, 0 rows affected (0.00 sec)
3) Slave上执⾏
springboot属性文件mysql> CHANGE MASTER TO
MASTER_HOST='172.31.0.28',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=685;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
# 查看sql和io状态看到Slave_IO_Running: Yes 和Slave_SQL_Running: Yes 即是主从复制成功
mysql> show slave status\G
在MySQL代理服务器172.31.0.48安装mycat并启动
[root@centos8 ~]# yum install java mysql-server -y
[root@centos8 ~]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
# 下载并安装
[root@centos8 ~]# wget /1.6.7.6/20210303094759/Mycat-server-1.6.7. [root@centos8 ~]# mkdir /apps
[root@centos8 ~]# tar xf Mycat-server-1.6.7. -C /apps/
# 配置环境变量
[root@centos8 ~]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[root@centos8 ~]# source /etc/profile.d/mycat.sh
# 启动mycat
[root@centos8 ~]# mycat
Usage: /apps/mycat/bin/mycat { console | start | stop | restart | status | dump }
[root@centos8 ~]# mycat start
#可以看到打开多个端⼝,其中8066端⼝⽤于连接MyCAT
[root@centos8 ~]# ss -tan
LISTEN 0 128 *:8066 *:*
#查看⽇志,确定成功,可能需要等⼀会⼉才能看到成功的提⽰
[root@centos8 ~]# tail /apps/mycat/logs/wrapper.log
STATUS | wrapper | 2021/05/20 23:11:20 | --> Wrapper Started as Daemon
STATUS | wrapper | 2021/05/20 23:11:21 | Launching
INFO | jvm 1 | 2021/05/20 23:11:28 | Wrapper (Version 3.2.3)
INFO | jvm 1 | 2021/05/20 23:11:28 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2021/05/20 23:11:28 |
INFO | jvm 1 | 2021/05/20 23:11:29 | MyCAT Server startup successfully. see logs in logs/mycat.log
#⽤默认密码123456来连接mycat
[root@centos8 ~]# mysql -uroot -p123456 -h 172.31.0.48 -P8066 --default-auth=mysql_native_password
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.01 sec)
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
在mycat 服务器上修改l⽂件配置Mycat的连接信息
[root@centos8 ~]# vim /apps/mycat/l
#修改下⾯⾏的8066改为3306复制到到独⽴⾮注释⾏,加⼀⾏跳过验证,nonePasswordLogin:0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户
<property name="serverPort">3306</property>
<property name="nonePasswordLogin">1</property>
...
<user name="root" defaultAccount="true">
<property name="password">centos</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
mysql8.0如果上⾯没有添加nonePasswordLogin,使⽤如下⽅式登录即可
[root@centos8 ~]# mysql -uroot -pcentos -h 127.0.0.1 --default-auth=mysql_native_password
这⾥使⽤的是root,密码为centos,逻辑数据库为TESTDB,这些信息都可以⾃⼰随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上⾯这段配置,其他默认即
可。
修改l实现读写分离策略
[root@centos8 ~]# vim /apps/mycat/l
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat> <writeHost host="host1" url="172.31.0.28:3306" user="root" password="123456">
<readHost host="host2" url="172.31.0.38:3306" user="root" password="123456" /> </writeHost>
</dataHost></mycat:schema>
配置说明
1⼂读写分离配置:
设置 balance="1"与writeType="0"
Balance参数设置:
balance=“0”, 所有读操作都发送到当前可⽤的writeHost上。
balance=“1”,所有读操作都随机的发送到readHost。全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的balance=“2”,所有读操作都随机的在writeHost、readhost上分发
WriteType参数设置:
writeType=“0”, 所有写操作都发送到可⽤的writeHost上。
writeType=“1”,所有写操作都随机的发送到readHost。
writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不⼯作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,⽬前mycat 1.3和1.4版本2⼂双主切换策略配置:
设置 switchType="2" 与slaveThreshold="100"
switchType ⽬前有三种选择:
-1:表⽰不⾃动切换
1 :默认值,⾃动切换
创建网站大概要多少钱2 :基于MySQL主从同步的状态决定是否切换
“Mycat⼼跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat⼼跳机制通过检测 show slave status 中的 "Secon 重新启动mycat
[root@centos8 ~]# mycat restart
Stopped Mycat-server.
在后端主服务器创建⽤户并对mycat授权
mysql> create user 'root'@'172.31.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to 'root'@'172.31.0.%';
Query OK, 0 rows affected (0.01 sec)
在Mycat服务器上连接并测试
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
mysql> use TESTDB;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.02 sec)
# 查询是在从服务器执⾏
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 38 |
+-------------+
1 row in set (0.00 sec)
mysql> select @@hostname;
+----------------------+
| @@hostname |
+----------------------+
| centos8.longxuan.vip |
+----------------------+
1 row in set (0.00 sec)
通过通⽤⽇志确认实现读写分离
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
1 row in set (0.01 sec)
mysql> set global general_log=on;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global general_log_file='/tmp/general.log';
Query OK, 0 rows affected (0.00 sec)
show variables like 'general_log'; # 查看⽇志是否开启
set global general_log=on; # 开启⽇志功能
show variables like 'general_log_file'; # 查看⽇志⽂件保存位置
set global general_log_file='/tmp/general.log'; # 设置⽇志⽂件保存位置
在主和从服务器分别启⽤通⽤⽇志,查看读写分离
[root@centos8 ~]# vim /etc/myf
[mysqld]
server-id=28
log-bin=/data/mysql/mysql-bin
general_log=ON
[root@centos8 ~]# systemctl restart mysqld
[root@centos8 ~]# tail -f /var/lib/mysql/centos8.log
2021-05-20T16:37:17.338722Z 8 Query select user()
2021-05-20T16:37:27.251418Z 8 Query select user()
停⽌从节点,MyCAT⾃动调度读请求⾄主节点
[root@localhost ~]# systemctl stop mysqld
Mycat
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 28 |
+-------------+
# 停⽌主节点,MyCAT不会⾃动调度写请求⾄从节点
[root@centos8 ~]# systemctl stop mysqld
# Mycat
mysql> insert t1 values(1);
ERROR 1184 (HY000): java.ConnectException: Connection refused
MyCAT对后端服务器的健康性检查⽅法select user()
# 开启通⽤⽇志
[root@master ~]# mysql
mysql> set global general_log=1;
mysql> show variables like 'general_log_file';
+------------------+----------------------------+
sourcetree使用教程| Variable_name | Value |
+------------------+----------------------------+
| general_log_file | /var/lib/mysql/centos8.log |
+------------------+----------------------------+
1 row in set (0.01 sec)
[root@slave ~]# mysql
mysql> set global general_log=1;
mysql> show variables like '%general_log_file%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
1 row in set (0.00 sec)
# 查看通⽤⽇志
[root@master ~]# tail -f /var/lib/mysql/centos8.log
2021-05-20T16:43:44.836077Z 12 Query select @@server_id
2021-05-20T16:43:47.251021Z 11 Query select user()
[root@localhost ~]# tail -f /var/lib/mysql/localhost.log
2021-05-20T16:46:17.252055Z 14 Query select user()
2021-05-20T16:46:27.250239Z 10 Query select user()
2021-05-20T16:46:37.251025Z 12 Query select user()
登录mycat管理端:
[root@localhost ~]# mysql -uroot -pcentos -h 172.31.0.48 -P9066 --default-auth=mysql_native_pass
mysql> show @@heartbeat;
+-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP | +-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| host1 | mysql | 172.31.0.28 | 3306 | 1 | 0 | idle | 30000 | 1,1,1 | 2021-05-21 04:40:30 | false |
| host2 | mysql | 172.31.0.38 | 3306 | -1 | 1 | idle | 30000 | 1,1,12 | 2021-05-21 04:40:30 | false |
+-------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set (0.00 sec)
# RS_CODE为1表⽰⼼跳正常
show @@heartbeat; #检查⼼跳状态。
RS_CODE状态如下:
OK_STATUS= 1 代表正常状态。
ERROR_STATUS = -1 代表连接错误
TIMEOUT_STATUS= -2 代表连接超时
INIT_STATUS= 0 代表初始化状态
若节点发⽣故障,则会连续进⾏默认的5个周期检测,⼼跳连接失败后就会变成-1,节点故障确认,然后可能发⽣切换。
查看读写分离的机器配置情况
mysql> show @@datasource;
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | host1 | mysql | 172.31.0.28 | 3306 | W | 0 | 8 | 1000 | 141 | 4 | 4 |
| dn1 | host2 | mysql | 172.31.0.38 | 3306 | R | 0 | 0 | 1000 | 0 | 12 | 0 |
+----------+-------+-------+-------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
show @@datanode;该命令⽤于显⽰MyCAT的数据节点的列表
对应l 配置⽂件的dataNode节点,其中,“NAME”表⽰dataNode的名称;“dataHost”表⽰对应dataHost 属性的值,
即数据主机;“ACTIVE”表⽰活跃连接数;“IDLE”表⽰闲置连接数;“SIZE”对应总连接数量。
显⽰当前前端客户端连接情况
mysql> Show @@connection;
+-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| PROCESSOR | ID | HOST | PORT | LOCAL_PORT | USER | SCHEMA | CHARSET | NET_IN
| NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit | +-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| Processor15 | 4 | 172.31.0.100 | 9066 | 56752 | root | NULL | utf8:45 | 310 | 4696 | 792 | 4096 | 0 | | |
+-------------+------+--------------+------+------------+------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
1 row in set (0.00 sec)
主从不同步
报错:Last_SQL_Error: Error 'You are not allowed to create a user with GRANT' on query. Default database: 'db1'. Query: 'GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'172.31.0.%''
重新制作主从同步
# ⾸先停⽌slave
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
# 重置slave所有
mysql> reset slave all;
Query OK, 0 rows affected (0.01 sec)
CHANGE MASTER TO
MASTER_HOST='172.31.0.28',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=2609;
# master服务器创建表测试
mysql> create table test333(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
| test222 |
| test333 |
python编程下载安装教程
+---------------+
3 rows in set (0.00 sec)
# slave服务器查看是否同步
mysql> use db1;
Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
| test333 |
+---------------+
2 rows in set (0.00 sec)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论