在特定的业务场景下、有时候需要进行其他数据库的连接和join查询、下面是总结的几种方式!

一、在同一主机跨库查询

在不加库名情况!你是默认找不到表的!

默认情况

在sql查询的时候加上指定其他库名

指定库名

例子: select * from wk_user u left join video.wk_order o on o.userId=u.user_id where u.user_id=1;

这种方式比较简单也是不重点!

二、使用FEDERATED引擎实现数据表映射

FEDERATED存储引擎访问在远程数据库的表中的数据,而不是本地的表。这个特性给某些开发应用带来了便利,你可以直接在本地构建一个federated表来连接远程数据表,配置好了之后本地表的数据可以直接跟远程数据表同步。实际上这个引擎里面是不真实存放数据的,所需要的数据都是连接到其他MySQL服务器上。

查看数据库是否支持;

show ENGINES;

支持情况

图片情况是支持的只是没有开启~修改本机配置文件

添加:federated;

my.cnf

重启mysql服务器

在本地创建虚拟连接表

CREATE TABLE `wk_order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `create_time` int(11) NOT NULL COMMENT '订单的创建时间',
  `subject` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '主题',
  `payNum` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '支付订单号',
  `orderNum` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '订单号',
  `price` decimal(10,1) NOT NULL COMMENT '订单价格',
  `userId` int(11) NOT NULL COMMENT '用户id',
  `product` int(11) DEFAULT NULL COMMENT '商品信息',
  `type` int(11) NOT NULL DEFAULT '1' COMMENT '支付类型@1为阿里2是微信',
  `date_m` int(11) DEFAULT NULL COMMENT '订单月份',
  `order_type` int(11) DEFAULT NULL COMMENT '商品消费订单类型:1是课程类。2是会员类',
  PRIMARY KEY (`id`)
) ENGINE=FEDERATED AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 
CONNECTION = 'mysql://root:123456@10.10.10.191:3306/test/wk_order'


参数注意点:
ENGINE 必须指定为:ENGINE
CONNECTION参数形式:

mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]

name --  mysql用户名

pass -- mysql密码

location -- ip

port -- 端口号

db-name -- 数据库名

table-name -- 表名

PS:创建的表名和远程访问的表名可以不同。

注意事项

1.对本地虚拟表的结构修改,并不会修改远程表的结构
2.truncate 命令,会清除远程表数据
3.drop命令只会删除虚拟表,并不会删除远程表
4.不支持 alter table 命令


目前使用federated 最大的缺点:

  1. select count(), select from limit M, N 等语句执行效率非常低,数据量较大时存在很严重的问题,但是按主键或索引列查询,则很快,如以下查询就非常慢(假设 id 为主索引)
    select id from db.tablea where id >100 limit 10 ;

而以下查询就很快:
select id from db.tablea where id >100 and id<150

  1. 如果虚拟虚拟表中字段未建立索引,而实体表中为此字段建立了索引,此种情况下,性能也相当差。但是当给虚拟表建立索引后,性能恢复正常。
  2. 类似 where name like "str%" limit 1 的查询,即使在 name 列上创建了索引,也会导致查询过慢,是因为

federated引擎会将所有满足条件的记录读取到本,再进行 limit 处理。

这几个问题已经严重影响了federated 在实际环境中的应用,所以这个引擎很冷门,不过在一些特定环境还是能用的

三、主从复制

通过主从复制进行同步到本地主机进行查询、把远程主机设置成master。本地设置为SLAVE服务器

MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。

主从复制原理图

MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

准备工作

两台服务器、mysql环境

  1. 主10.10.10.191
  2. 从10.10.10.141

修改master配置文件

添加配置

log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

服务器配置

重启mysql,创建用于同步的用户账号

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> flush privileges;

注意我这里使用了%

我这个是测试环境不太严谨、正式情况可以修改、如果服务器是防火墙级别设定ip访问,可以忽略

例如:
mysql> CREATE USER 'repl'@'10.10.10.141' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.10.10.141';
mysql> flush privileges;

查看master状态,记录二进制文件名和位置

mysql>  SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     3262 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

修改SLAVE服务器

修改配置my.cnf

[mysqld]
server-id    = 2
binlog-do-db = test #指定复制数据库

进入命令行或控制台

CHANGE MASTER TO
   MASTER_HOST='10.10.10.191',
   MASTER_USER='repl',
   MASTER_PASSWORD='slavepass',
   MASTER_LOG_FILE='mysql-bin.000001',
   MASTER_LOG_POS=3262;

启动slave同步进程

start SLAVE;

查看slave状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.10.191
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 11662
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 11765
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
        ...

Slave_IO_RunningSlave_SQL_Running都为YES的时候就表示主从同步设置成功了。

注意事项

  1. 做主从复制前、数据要同步到从服务器上
  2. 设置好Position的时候、数据要保持一致
  3. 不要非正规的添加从服务器数据、造成索引不一致的情况
[mysqld]
skip-slave-start

如果出现问题可以在配置文件添加上skip-slave-start意思是启动slave从库的时候,复制线程不会随着mysql进程启动而开启,如果你需要启动就需要手动执行start slave命令。这个skip-slave-start是防止发生意外mysql从服务器起不来

参考连接:https://blog.csdn.net/commasx/article/details/87284878

Last modification:December 20, 2021
如果觉得我的文章对你有用,请随意赞赏