接上一篇:企业实战_13_MyCat清除冗余数据
https://gblfy.blog.csdn.net/article/details/100057317
文章目录
- 一、跨分片查询验证
- 1. 登录mycat
- 2. 使用逻辑数据库
- 1.3. 执行跨分片查询
- 1.4. 异常信息,问题定位
- 1.5. 表分布
- 1.6. 跨分片查询的解决方式
- 1.7. 场景分析
- 二、企业实战跨分片查询
- 2.1. 基础操作(熟悉即可)
- 2.2. node2节点导出表数据
- 2.3. node3节点导入表数据
- 2.4. node4节点导入表数据
- 2.5. MyCat节点
- 2.6. 重启MyCat使配置生效
- 2.7. 再次跨分页查询验证
- 三、全局表验证
- 3.1. 修改全局表数据
- 3.2. node2节点数据验证
- 3.3. node3节点数据验证
- 3.4. node4节点数据验证
一、跨分片查询验证
1. 登录mycat
在任意节点(node4)上登录mycat
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066
2. 使用逻辑数据库
use imooc_db;
1.3. 执行跨分片查询
SELECTsupplier_name,b.region_name AS '省',c.region_name AS '市',d.region_name AS '区'
FROMproduct_supplier_info aJOIN region_info b ON b.region_id = a.provinceJOIN region_info c ON c.region_id = a.cityJOIN region_info d ON d.region_id = a.district;
1.4. 异常信息,问题定位
ERROR 1064 (HY000): invalid route in sql, multi tables found but datanode has no intersection sql
1.5. 表分布
表 | 节点 |
---|---|
region_info | node1 |
product_supplier_info | node2 |
针对这种情况应该如何处理呢? |
1.6. 跨分片查询的解决方式
序号 | 方案 | 说明 |
---|---|---|
① | api方式 | 通过前端程序,去订单模块中分别获取省市区的信息,之后拼接在一起 |
② | 数据冗余的方式 | 把这些省市区的信息冗余到商品模块的供应商表中 |
③ | 全局表 | 字典表跨分片操作 |
1.7. 场景分析
- 字典类的表:
如果通过api方式,查询的频率比较高,api调取的次数也会很高,而且通过前台程序,api调用再去拼接,比较耗时。
如果通过数据冗余方式,这个数据的冗余度比较大,字段不多还好说,针对字段比较多的字典表的话,一旦修改的话,我们就要修改和字段表相关的表,因此,字典类型的不适用api和数据冗余的方式进行处理。
MyCat提供的全局表的功能,在每个分片上都会有这个全局表,也就是说,我们会把region_info这个表以相同的数据,存储到这3个数据节点中,然后再schema.xml中声明全局表。
二、企业实战跨分片查询
2.1. 基础操作(熟悉即可)
步骤 | 命令 | 说明 |
---|---|---|
① | mysqldump -uroot -p order_db region_info > region_info | 导出备份region_info表 |
② | mysql -uroot -p product_db < region_info | 将region_info 数据导入到product_db数据库中 |
③ | scp region_info root@192.168.43.172:/root | 将region_info 表以root用户同步到ip为192.x服务器的root目录下面 |
2.2. node2节点导出表数据
# 在node2节点上导出备份region_info表mysqldump -uroot -p order_db region_info > region_info# 复制到node3上scp region_info root@192.168.92.103:/root# 复制到node4上scp region_info root@192.168.92.104:/root
2.3. node3节点导入表数据
# 将region_info 数据导入到product_db数据库中
mysql -uroot -p product_db < region_info# 登录mysql
mysql -uroot -p
Enter password: 123456# 使用product_db数据库
use product_db;# 查询region_info是否导入成功
show tables;执行日志:
mysql> show tables;
+-----------------------+
| Tables_in_product_db |
+-----------------------+
| product_brand_info |
| product_category |
| product_comment |
| product_info |
| product_pic_info |
| product_supplier_info |
| region_info |
+-----------------------+
7 rows in set (0.00 sec)mysql>
2.4. node4节点导入表数据
# 将region_info 数据导入到customer_db数据库中
mysql -uroot -p customer_db< region_info# 登录mysql
mysql -uroot -p
Enter password: 123456# 使用customer_db数据库
use customer_db;# 查询region_info是否导入成功
show tables;执行日志:
mysql> show tables;
+-----------------------+
| Tables_in_customer_db |
+-----------------------+
| customer_balance_log |
| customer_inf |
| customer_level_inf |
| customer_login |
| customer_login_log |
| customer_point_log |
| region_info |
+-----------------------+
7 rows in set (0.00 sec)mysql>
2.5. MyCat节点
# 进入mycat的conf目录下面cd /app/mycat/conf/# 编辑schema.xml文件vim schema.xml# 将region_info逻辑表,定义为全局表
将<table name="region_info" primaryKey="region_id" dataNode="ordb" />
调整为<table name="region_info" primaryKey="region_id" dataNode="ordb,prodb,custdb" type="global"/>
2.6. 重启MyCat使配置生效
# 停止mycat
mycat stop# 启动mycat
mycat start# 查看启动日志
[root@node1 conf]# tail -f /app/mycat/logs/wrapper.log
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
INFO | jvm 1 | 2021/07/11 17:27:51 | MyCAT Server startup successfully. see logs in logs/mycat.log
2.7. 再次跨分页查询验证
# 使用mysql客户端连接mycat
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066# 验证跨分片查询
# 执行跨分片查询
SELECTsupplier_name,b.region_name AS '省',c.region_name AS '市',d.region_name AS '区'
FROMproduct_supplier_info aJOIN region_info b ON b.region_id = a.provinceJOIN region_info c ON c.region_id = a.cityJOIN region_info d ON d.region_id = a.district;
三、全局表验证
登录mycat修改全局表数据,验证是否同步3个物理节点的物理库的全局表
3.1. 修改全局表数据
登录MyCat修改全局表数据,验证是否可以同步到其他3个数据节点中
#使用mysql客户端连接mycat
mysql -uapp_imooc -p123456 -h192.168.92.101 -P8066# 使用逻辑库
use imooc_db;# 查看全局表数据
select * from region_info;
mysql> select * from region_info;
+-----------+-----------+---------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+---------------+--------------+
| 1 | 0 | 中国(china) | 0 |
+-----------+-----------+---------------+--------------+
1 row in set (0.29 sec)mysql>
更新全局表数据
-------------------------------------------------# 更新全局表数据
update region_info set region_name='中国2022' where region_id=1;# 更新后,再次查看全局表数据
select * from region_info limit 10;
Database changed
mysql> select * from region_info;
+-----------+-----------+---------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+---------------+--------------+
| 1 | 0 | 中国(china) | 0 |
+-----------+-----------+---------------+--------------+
1 row in set (0.29 sec)mysql> update region_info set region_name='中国2022' where region_id=1;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from region_info;
+-----------+-----------+-------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+-------------+--------------+
| 1 | 0 | 中国2022 | 0 |
+-----------+-----------+-------------+--------------+
1 row in set (0.00 sec)mysql>
注:mysql更新数据库失败 --read-only 请进入传送门:
https://blog.csdn.net/weixin_40816738/article/details/100059688
3.2. node2节点数据验证
登录node2节点
- 在登录mycat节点修改全局表数据后,查看node2节点的数据是否被更新
# 登录数据库mysql -uroot -p # 使用指定数据use order_db;# 更新后,再次查看全局表数据
select * from region_info;发现通过登录mycat节点修改全局表数据,node2节点的数据已经更新Database changed
mysql> select * from region_info;
+-----------+-----------+-------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+-------------+--------------+
| 1 | 0 | 中国2022 | 0 |
+-----------+-----------+-------------+--------------+
1 row in set (0.00 sec)mysql>
3.3. node3节点数据验证
登录node3节点
- 查看在登录mycat节点修改全局表数据,node3节点的数据是否被更新
# 登录数据库mysql -uroot -p # 使用指定数据use product_db;# 更新后,再次查看全局表数据
select * from region_info limit 10;发现通过登录mycat节点修改全局表数据,node3节点的数据已经更新mysql> select * from region_info limit 10;
+-----------+-----------+-------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+-------------+--------------+
| 1 | 0 | 中国2022 | 0 |
+-----------+-----------+-------------+--------------+
1 row in set (0.01 sec)mysql>
3.4. node4节点数据验证
- 查看在登录mycat节点修改全局表数据,node3节点的数据是否被更新
# 登录数据库mysql -uroot -p # 使用指定数据use customer_db;# 更新后,再次查看全局表数据
select * from region_info limit 10;发现通过登录mycat节点修改全局表数据,node4节点的数据已经更新mysql> select * from region_info limit 10;
+-----------+-----------+-------------+--------------+
| region_id | parent_id | region_name | region_level |
+-----------+-----------+-------------+--------------+
| 1 | 0 | 中国2022 | 0 |
+-----------+-----------+-------------+--------------+
1 row in set (0.00 sec)mysql>
下一篇:企业实战_15_MySql主从复制到MyCat总结
https://gblfy.blog.csdn.net/article/details/118657995