MySQL数据库如何实现跨服务器访问数据

2023年 11月 27日 70.7k 0

点击上方蓝字关注我

    在使用MySQL数据库时,很多同学经常会问,我能跨服务器访问另一库的数据么?得到的答案很多时候是让人失望的。那么如果真的需要访问,又不想使用拷贝表及数据的方式,可以实现么,又该如何实现呢?

1.  如何实现

先说结论:在MySQL数据库中,是可以实现跨实例(跨服务器)访问另一个库中表的。

实现方法:MySQL数据库的其中一个优点就是插件式管理,因此,可以使用 FEDERATED 存储引擎来实现来实现。

开启FEDERATED存储引擎:

开启的方式是在配置文件中添加FEDERATED配置,即:

    [mysqld]
    federated

    开启后如下:

    可见,已经支持FEDERATED存储引擎

    2.  具体案例

    下面列举具体示例来演示

    2.1  具体案例

    需求: 假设服务器A实例中的testdb1库里有一张表tb1,现在想在服务器B的testdb2中直接访问testdb1中的tb1表的数据

    实现步骤:

    1) 在服务器A中创建表

      mysql> create database testdb1;
      Query OK, 1 row affected (0.00 sec)


      mysql> use testdb1;
      Database changed
      mysql> create table tb1(id int primary key ,c1 varchar(20));
      Query OK, 0 rows affected (0.01 sec)


      mysql> insert into tb1 values(1,'a');
      Query OK, 1 row affected (0.01 sec)


      mysql> insert into tb1 values(2,'b'),(3,'ca'),(4,'tc');
      Query OK, 3 rows affected (0.01 sec)
      Records: 3 Duplicates: 0 Warnings: 0


      mysql> select * from tb1;
      +----+------+
      | id | c1 |
      +----+------+
      | 1 | a |
      | 2 | b |
      | 3 | ca |
      | 4 | tc |
      +----+------+
      4 rows in set (0.00 sec)

      因为需要远程访问A服务器上的表的权限,因此需创建一个数据库用户用来远程访问

        mysql> create user t_user identified by 'Test2023.com';
        Query OK, 0 rows affected (0.00 sec)


        mysql> grant all on testdb1.* to t_user;
        Query OK, 0 rows affected (0.01 sec)

        2) 在服务器B的数据库testdb2上创建FEDERATED存储引擎表

          mysql> create database testdb2;
          Query OK, 1 row affected (0.00 sec)


          mysql> use testdb2;
          Database changed
          mysql> create table testdb2_tb1(
          -> id INT PRIMARY KEY ,
          -> c1 varchar(20)
          -> )ENGINE=FEDERATED
          -> CONNECTION='mysql://t_user:Test2023.com@127.0.0.1:3306/testdb1/tb1';
          Query OK, 0 rows affected (0.00 sec)


          mysql> show tables;
          +-------------------+
          | Tables_in_testdb2 |
          +-------------------+
          | testdb2_tb1 |
          +-------------------+
          1 row in set (0.00 sec)


          mysql> select * from testdb2_tb1;
          +----+------+
          | id | c1 |
          +----+------+
          | 1 | a |
          | 2 | b |
          | 3 | ca |
          | 4 | tc |
          +----+------+
          4 rows in set (0.02 sec)

          创建后可以直接访问到A服务器中的tb1表的数据。

          2.2  其他操作

          除了查询,如果创建FEDERATED引擎表的账号(如本文用的t_user)有增删改的权限,那么也可以通过操作B服务器的testdb2.testdb2_tb1对远程表(服务器A上的testdb.tb1)进行相应的操作,例如:

          1) 在服务器B上新增数据

            mysql> select * from testdb2_tb1;
            +----+------+
            | id | c1 |
            +----+------+
            | 1 | a |
            | 2 | b |
            | 3 | ca |
            | 4 | tc |
            +----+------+
            4 rows in set (0.00 sec)


            mysql> insert into testdb2_tb1 values(5,'cc'),(6,'ty');
            Query OK, 2 rows affected (0.00 sec)
            Records: 2 Duplicates: 0 Warnings: 0


            mysql> select * from testdb2_tb1;
            +----+------+
            | id | c1 |
            +----+------+
            | 1 | a |
            | 2 | b |
            | 3 | ca |
            | 4 | tc |
            | 5 | cc |
            | 6 | ty |
            +----+------+
            6 rows in set (0.00 sec)

            2) 在A服务器上查看数据情况:

              mysql> use testdb1;
              Database changed
              mysql> select * from tb1;
              +----+------+
              | id | c1 |
              +----+------+
              | 1 | a |
              | 2 | b |
              | 3 | ca |
              | 4 | tc |
              +----+------+
              4 rows in set (0.00 sec)


              mysql> select * from tb1;
              +----+------+
              | id | c1 |
              +----+------+
              | 1 | a |
              | 2 | b |
              | 3 | ca |
              | 4 | tc |
              | 5 | cc |
              | 6 | ty |
              +----+------+
              6 rows in set (0.00 sec)

              3) 其他操作

                mysql> delete from testdb2_tb1 where id=1;
                Query OK, 1 row affected (0.01 sec)


                mysql> update testdb2_tb1 set c1='bb' where id=2;
                Query OK, 1 row affected (0.00 sec)
                Rows matched: 1 Changed: 1 Warnings: 0


                mysql> select * from testdb2_tb1;
                +----+------+
                | id | c1 |
                +----+------+
                | 2 | bb |
                | 3 | ca |
                | 4 | tc |
                | 5 | cc |
                | 6 | ty |
                +----+------+
                5 rows in set (0.00 sec)


                mysql> alter table testdb2_tb1 add key idx_c1(c1);
                ERROR 1031 (HY000): Table storage engine for 'testdb2_tb1' doesn't have this option


                mysql> create index idx_c1 on testdb2_tb1(c1);
                ERROR 1031 (HY000): Table storage engine for 'testdb2_tb1' doesn't have this option
                mysql> truncate table testdb2_tb1;
                Query OK, 0 rows affected (0.03 sec)


                mysql> select * from testdb2_tb1;
                Empty set (0.00 sec)

                可见:增删改查均可以,但是不支持ALTER TABLE操作,可以支持truncate table操作。

                3. 小结

                    MySQL数据库使用FEDERATED引擎表表,可以实现库实例(跨服务器)的数据访问及处理,这极大的方便了数据间的关联、对比及数据治理。关于其实现原理及优劣势可以在以后的课程合集中细说,感兴趣的也可以多实验了解。

                往期精彩回顾

                1.  MySQL高可用之MHA集群部署

                2.  mysql8.0新增用户及加密规则修改的那些事

                3.  比hive快10倍的大数据查询利器-- presto

                4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

                5.  PostgreSQL主从复制--物理复制

                6.  MySQL传统点位复制在线转为GTID模式复制

                7.  MySQL敏感数据加密及解密

                8.  MySQL数据备份及还原(一)

                9.  MySQL数据备份及还原(二)

                扫码关注     

                相关文章

                Oracle如何使用授予和撤销权限的语法和示例
                Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
                下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
                社区版oceanbase安装
                Oracle 导出CSV工具-sqluldr2
                ETL数据集成丨快速将MySQL数据迁移至Doris数据库

                发布评论