应用开发一般情况只会使用一个DB视图(多DB集群同步复制的可以视为一个DB,它们之间的数据同步策略可以由DBA来配置,跟开发人员无关),如果需要访问其他应用的DB,不建议直接连到DB操作,而是通过封装好的web服务接口来访问。
那有没有就是要直接用不同服务器上的DB的场景呢?这个不好说,不过技术上也没有什么问题,像nodejs本来就是可以直接连接不同服务器上的数据库,甚至是异构的也没有问题(比如一个是mysql,另一个是mariadb),跨数据库的数据复制抽取可以这样弄下。下面是例程:
var jargs = require('./argspw.json'); //json配置文件
require('bytenode');
const mycrypt = require('./mycrypt.jsc'); //自己写的加解密算法,口令密文存放于json配置文件,需要解密const mysql = require("mysql");
const remotepool= mysql.createPool({host:jargs.mysqlip1,user:jargs.mysqluser1,password:mycrypt.decrypt(jargs.mysqlpw1),port:jargs.mysqlport1,database:jargs.mysqldatabase1});
const localpool= mysql.createPool({host:jargs.mysqlip2,user:jargs.mysqluser2,password:mycrypt.decrypt(jargs.mysqlpw2),port:jargs.mysqlport2,database:jargs.mysqldatabase2});const getfiles = 'select * FROM locfiles where recvtime> current_date() )'; //当天新记录
const addfiles = 'insert into locfilesc(reqid,filename,filesize,recvtime) values ?' ;remotepool.getConnection((errmpgc, remoteconn)=> { if (errmpgc) { console.log("建立连接失败"); } else {remoteconn.query(getfiles,(errq1,results1)=> { if (errq1) { console.log("SQL执行失败"); console.log(errq1); }else { console.log("SQL执行成功"); console.log(JSON.stringify(results1)); let tfds=[]results1.forEach(item=>{tfds.push(Object.values(item))});localpool.getConnection((errmpgc, localconn)=> { if (errmpgc) { console.log("建立连接失败"); } else {localconn.query(addfiles,[tfds],(errq2,results2)=> { if (errq2) { console.log("SQL执行失败"); console.log(errq2); }else { console.log("SQL执行成功"); console.log(JSON.stringify(results2)); }})localconn.release();}})}})remoteconn.release();}});
开发一般还可以尝试使用mysql的FEDERATED引擎,开启FEDERATED引擎后,在远程DB中创建连接用户并授权库表权限,然后在本地DB中使用FEDERATED引擎连接远程DB创建表,之后就可以像访问本地DB库表一样操作远程DB的库表。
另外,MySQL官方工具Workbench中Schema Transfer Wizard可以在不同服务器之间进行库表迁移,主要是db运维人员操作。