mysql 命令不同步,MySQL错误-命令不同步;您现在不能运行此命令

I am using MySQL with PHP, Codeigniter. I had a question which was answered by bluefeet in the post here

I created a stored procedure for the second solution by bluefeet. It works perfect, however, while the procedure is called in the production environment, all the other users get the error

Commands out of sync; you can't run this command now

Not sure how can i overcome with this error. I also tried closing the connection after the procedure is called, however, Queries from other users are executed before the connection is closed. Any work-around for this issue?

Below is the stored procedure that i have used

DROP PROCEDURE IF EXISTS mailbox.circle_pending_p;

CREATE PROCEDURE mailbox.`circle_pending_p`()

BEGIN

SET @sql = NULL;

SELECT

GROUP_CONCAT(DISTINCT

CONCAT(

'sum(CASE WHEN maildate = ''',

date_format(mailtime, '%e-%b'),

''' THEN 1 else 0 END) AS `',

date_format(mailtime, '%e-%b'), '`'

)

) INTO @sql

FROM circle_pending_temp

WHERE mailtime >= (select date_sub(max(mailtime), interval 8 DAY)

from circle_pending_temp);

SET @sql

= CONCAT('SELECT coalesce(email_Circle, ''Grand Total'') Circle,

max(`< 9 days`) `< 9 days`, ', @sql, ' ,

count(*) GrandTotal

from

(

select c.email_Circle,

date_format(c.mailtime, ''%e-%b'') maildate,

coalesce(o.`< 9 days`, 0) `< 9 days`

from circle_pending_temp c

left join

(

select email_Circle,

count(*) `< 9 days`

from circle_pending_temp

where mailtime <= (select date_sub(max(mailtime), interval 8 DAY)

from circle_pending_temp)

) o

on c.email_Circle = o.email_Circle

where c.mailtime >= (select date_sub(max(mailtime), interval 8 DAY)

from circle_pending_temp)

) d

group by email_Circle with rollup ');

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

END;

The PHP that i use for calling this procedure is

$db = $this->load->database('mailbox',TRUE);

$res = $db->query('Call circle_pending_p()');

echo $db->_error_message();

$db->close();

$db = $this->load->database('mailbox',TRUE);

if ($res->num_rows() > 0) {

return $res->result_array();

} else {

return 0;

}

解决方案

Got the Answer! It seems like codeigniter's mysql driver has bugs handling stored procedures.

I changed the drivers from mysql to mysqli in the config/database file by changing

$db['default']['dbdriver'] = 'mysql';

to

$db['default']['dbdriver'] = 'mysqli';

Post that i modified the system/database/drivers/mysqli/mysqli_result.php file and added the below function

function next_result()

{

if (is_object($this->conn_id))

{

return mysqli_next_result($this->conn_id);

}

}

and modified the model as below

$db = $this->load->database('mailbox',TRUE);

$qry_res = $db->query('Call circle_pending_p()');

echo $db->_error_message();

$res = $qry_res->result_array();

$qry_res->next_result();

$qry_res->free_result();

if (count($res) > 0) {

return $res;

} else {

return 0;

}

This solved the problem!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL主从同步有两种方式:基于语句的复制和基于行的复制。无论使用哪种方式,都需要进行以下几个步骤: 1. 在主服务器上开启二进制日志功能 2. 在主服务器上创建一个用于从服务器连接的用户,并赋予该用户复制权限 3. 在从服务器上配置主服务器的相关信息,并启动从服务器的复制进程 以下是基于语句的复制的具体命令行操作: 1. 在主服务器上开启二进制日志功能 ``` vim /etc/my.cnf ``` 在 [mysqld] 段中添加如下配置: ``` log-bin=mysql-bin binlog-format=statement ``` 保存并退出,重启 MySQL 服务使配置生效。 2. 在主服务器上创建一个用于从服务器连接的用户,并赋予该用户复制权限 ``` CREATE USER 'replica'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%'; FLUSH PRIVILEGES; ``` 注意:在 MySQL 8.0 版本及以上,需要将 REPLICATION SLAVE 改为 REPLICATION SLAVE PROXY。 3. 在从服务器上配置主服务器的相关信息,并启动从服务器的复制进程 ``` vim /etc/my.cnf ``` 在 [mysqld] 段中添加如下配置: ``` server-id=2 relay-log=mysql-relay-bin log_slave_updates=1 read_only=1 ``` 其中,server-id 是从服务器的唯一标识符,可以设置为任意整数;relay-log 是从服务器用于存储复制事件的日志文件;log_slave_updates=1 表示从服务器将接收到的变更事件也写入自己的二进制日志文件中;read_only=1 表示从服务器只能读取数据,不能写入数据。 保存并退出,重启 MySQL 服务使配置生效后,执行以下命令启动从服务器的复制进程: ``` CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=100; START SLAVE; ``` 其中,MASTER_HOST 是主服务器的 IP 地址;MASTER_USER 和 MASTER_PASSWORD 是在主服务器上创建的用于从服务器连接的用户和密码;MASTER_LOG_FILE 和 MASTER_LOG_POS 分别是主服务器当前二进制日志文件的名称和位置,可以通过在主服务器上执行 SHOW MASTER STATUS 命令获取。 至此,基于语句的复制的主从同步已经完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值