用线上数据库做开发

我在开发Web网站的时候,一般在本地调试好没问题后,再上传到服务器。本地调试时,数据从哪里来呢?通常我会在刚开始的时候生成一些伪数据作为测试用途,如果是已经上线的系统,则我可能会dump一部分数据(通常一个月)下来,然后测试。然而,每次都这么做则要耗费不少时间,而且还要占据本地的存储空间。另外,如果换台机器开发,这个过程可能还要重复一次。

直到最近一次阅读中,发现ssh有-L这个参数,使得我可以把远程数据库当作本地数据库使用。具体来说,-L参数可以把发往本地端口的数据透明地传送到指定目标的指定端口。-L port:host:hostport,其中port是本地监听的端口,host是目标主机(从ssh服务器发起连接),hostport是目标主机的端口。因此,-L 3306:localhost:3306,就能把发往本地3306端口的数据转发到ssh服务器的3306端口,从而在本地可以直接访问MySQL服务器。

MySQL connection

值得注意的是,如果这时直接连接服务器,例如mysql -u root,那么会提示错误,如上图所示。这是因为,mysql如果发现服务器是localhost时,会自动使用socket file,而不是建立TCP连接。解决方法是让mysql客户端强制使用TCP连接,即加--protocol=TCP;或者指定host为127.0.0.1,即-h 127.0.0.1。

除了文中的例子外,端口转发还能做很多事情,大家不妨发散思维。值得注意的是,直接利用线上服务器做开发有一定风险,只涉及查询数据的开发我才敢这么做,如果涉及到修改数据,那还是用测试数据库吧。