应用开发一般情况只会使用一个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运维人员操作。