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

点击上方蓝字关注我

0f7399573da7fab7047f626c931a6210.png

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

1.  如何实现

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

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

启FEDERATED存储引擎:

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

[mysqld]
federated

开启后如下:

170140487c77d08011277e76d3dd82a8.png

可见,已经支持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)

a9d9a4bd9e2813ec656d226e56482d9b.png

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)

41e3bdf944b9c44ae36a3dbadf6f5803.png

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

d5b9cd9d5b94d6885564e022ab62c992.png

往期精彩回顾

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数据备份及还原(二)

93c6c90466de2d7896d6bf6fb0ce2c42.png

扫码关注     

391ef64840091be536178cf4d5805b30.jpeg

8f568a8a620ecc479ebd2c86bdedf5e7.png

6641a4eac9e8aa27fc3b3420b40668bb.png

### 回答1: 可以使用MySQL命令行客户端或第三方工具连接MySQL数据库,然后使用SQL语句查询并提取数据。例如,可以使用以下命令连接MySQL服务器: ``` mysql -u用户名 -p密码 ``` 然后,可以使用以下SQL语句查询数据库并输出结果: ``` SELECT * FROM 数据库名.表名; ``` 还可以使用mysqldump工具来导出整个数据库或特定表的数据。 ``` mysqldump -u用户名 -p密码 数据库名 > 导出文件名.sql ``` 或者使用工具如Navicat,Workbench等进行查询和导出 ### 回答2: 要提取Linux服务器上的MySQL数据库数据,可以按照以下步骤进行操作: 1. 首先,登录到Linux服务器上。可以使用SSH等工具连接服务器。 2. 确保MySQL数据库已安装和运行。可以使用命令"sudo systemctl status mysql"来检查MySQL服务的状态。 3. 使用命令"mysql -u 用户名 -p"登录到MySQL数据库。其中用户名是具有数据库访问权限的用户的用户名。 4. 登录成功后,可以使用命令"show databases;"列出所有的数据库。 5. 使用命令"use 数据库名;"选择要提取数据数据库。其中数据库名是要提取数据数据库名称。 6. 使用命令"show tables;"列出所选数据库中的所有表。 7. 选择要提取数据的表,可以使用命令"select * from 表名;"来提取整个表的数据。如果只需要部分数据,可以使用更具体的查询条件。 8. 使用命令"select * from 表名 into outfile '文件路径';"将提取的数据导出到指定文件路径。注意要确保文件路径具有写入权限。 9. 导出数据完成后,可以使用"exit;"命令退出MySQL数据库。 10. 最后,可以通过下载文件或通过SCP等工具将导出的数据文件从Linux服务器复制到本地计算机。 以上是在Linux服务器上提取MySQL数据库数据的简单步骤。根据实际情况可能会有一些差异,但这些步骤提供了一个基本的操作指南。 ### 回答3: 要提取Linux服务器上的MySQL数据库数据,可以按照以下步骤进行操作: 1. 确保已经安装了MySQL客户端软件。如果没有安装,可以使用以下命令进行安装: ``` sudo apt-get update sudo apt-get install mysql-client ``` 2. 使用以下命令连接MySQL服务器: ``` mysql -u 用户名 -p ``` 其中,用户名是连接MySQL服务器的用户名,-p选项用于提示输入密码。输入密码后,将连接MySQL服务器的命令行界面。 3. 选择要提取数据数据库: ``` USE 数据库名; ``` 将数据库名替换为要提取数据的实际数据库名。 4. 使用以下命令提取数据: ``` SELECT * FROM 表名; ``` 将表名替换为要提取数据的实际数据表名,* 表示提取所有数据列。也可以根据需要选择特定的列进行提取。 5. 提取的数据可以使用以下命令导出到一个文件中: ``` SELECT * FROM 表名 INTO OUTFILE '文件路径'; ``` 将表名替换为要提取数据的实际数据表名,将文件路径替换为希望导出数据的文件路径。 6. 完成后,可以使用以下命令退出MySQL服务器: ``` EXIT; ``` 通过按照上述步骤,您可以在Linux服务器上提取MySQL数据库中的数据并将其导出到一个文件中,以便进行进一步的处理或备份。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值