1.安装
wget http://www.onexsoft.com/software/oneproxy-rhel6-linux64-v6.2.0-ga.tar.gz
解压到某个目录,如:(/usr/local),然后修改demo.sh文件的目录:
#/bin/bash
#
export ONEPROXY_HOME=/usr/local/oneproxy
ulimit -c unlimited
# valgrind --leak-check=full \
${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf
再修改conf/proxy.conf
文件的文件目录:
....
ONEPROXY_HOME=/usr/local/oneproxy
ONEPROXY_SBIN="${ONEPROXY_HOME}/bin/oneproxy"
ONEPROXY_CONF="${ONEPROXY_HOME}/conf/proxy.conf"
ONEPROXY_PID="${ONEPROXY_HOME}/log/oneproxy.pid"
....
获取oneproxy加密后的密文密码(假设密码:123456):
[root@192 bin]# ./mysqlpwd 123.com
7FB703DA3682A0CCC20168D44E8A7E92FE676A51
修改proxy.conf文件:
[oneproxy]
proxy-license = A2FF461456A67F28,D2F6A5AD70C9042D
proxy-httpserver = 0.0.0.0:8080
proxy-auto-readonly = 0
# proxy-slave-addresses.1 = db1:3306@default
proxy-master-addresses.2 = 119.27.188.224:3306@blog
# proxy-slave-addresses.3 = ...
proxy-group-policy = blog:read_failover
proxy-user-list = root/9D7E55EAF8912CCBF32069443FAC452794F8941B@blog
remote-address.1 = 119.27.188.224:4041
#vip-address = 192.168.1.121/eth0:vip
proxy-part-template = conf/template.txt
proxy-part-tables = conf/part.txt
proxy-sequence-group = default
proxy-sequence.1 = seq1
network-blocking = 0
proxy-auto-readonly:自动切换读写角色
proxy-group-policy:预定义策略,对应真实要管理的数据库
proxy-user-list:指明连接数据库用户密文密码要与真实数据库用户密码对应@符后指的是数据库
启动oneproxy
[root@192 oneproxy]# chmod +x demo.sh
[root@192 oneproxy]# ./demo.sh
[root@192 oneproxy]# ./oneproxy.service start
Starting OneProxy … [ OK ]
[root@192 conf]# ss -anpt | grep 3307
LISTEN 0 128 :3307 ? users:((“oneproxy”,pid=3401,fd=11))
[root@192 conf]# ss -anpt | grep 4041
LISTEN 0 128 :4041 ? users:((“oneproxy”,pid=3401,fd=13))
访问oneproxy管理网页
输入http://oneproxy_ip:8080
默认用户名admin,密码OneProxy
遇到的问题
- SQLSTATE[42000]: Syntax error or access violation: 1149 prepared statement not supported in OneProxy
报错表示不能在oneproxy使用prepare,查看new PDO时的param参数是否有PDO::ATTR_EMULATE_PREPARES = false 的配置,如果有该配置,改为true,或者直接去掉该选项, 问题能解决.
PDO::ATTR_EMULATE_PREPARES = false,表示 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。
当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
1、你不能让占位符 ? 代替一组值
2.你不能让占位符代替数据表名或列名