mysql 如何在mariaDB上记录完整的查询语句,包括插入“?”参数

3npbholx  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(35)

我有一个运行在docker容器下的mariadb:10.10.6。我正在使用该数据库的java微服务中运行一些测试,我想记录java客户端发送到数据库的确切查询。
我尝试将配置文件设置为:

general_log = ON
general_log_file = /var/log/mysql/general.log
log_slow_verbosity = full

字符串
但是general日志文件仍然在insert语句中带有?,我有很多理由相信它正在压缩它:

254 Close stmt   
   254 Prepare  insert into announce_images (announce_id, image) values (?, ?)
   254 Execute  insert into announce_images (announce_id, image) values (?, ?)


我试图使用java持久性提供程序进行批量插入,我非常希望看到一个日志显示

insert into announce_images (announce_id, image) values (?, ?) (?, ?) (?, ?) (?, ?) (?, ?) (?, ?) (?, ?) (?, ?) (?, ?)


因此我可以保证持久性提供程序确实在进行批插入。
我怎么能得到一个更完整准确的日志mariadb

xfyts7mz

xfyts7mz1#

与MariaDB Connector/Python一样,MariaDB Java Connector使用二进制协议(预处理语句)进行批处理操作。
二进制协议的使用通过减少调用的数量以及SQL语句所需的数据库往返次数,速度快了10倍:
首先,它发送COM_STMT_EXECUTE命令(包含SQL语句),然后是COM_STMT_EXECUTE命令(包含行数,然后是所有数据)。此方法不需要重写SQL语句(使用VALUES(),(),()语法),也适用于SQL和UPDATE批处理操作。
要检查持久性提供程序是否真的在进行批量插入,有两种可能的解决方案:

  • 如果您不关心性能损失,请禁用选项useBulkStmts(自3.0.0版以来,默认情况下启用useBulkStmts。)。
  • 不检查常规日志,而是使用mysqlbinlog命令检查二进制日志(行格式):

示例(具有2行的批次):

#231215  7:51:09 server id 1  end_log_pos 10563 CRC32 0x1bc95e3a        Annotate_rows:
#Q> insert into t1 values (?)
#231215  7:51:09 server id 1  end_log_pos 10608 CRC32 0xad5a2a5f        Table_map: `test`.`t1` mapped to number 63
# at 10608
#231215  7:51:09 server id 1  end_log_pos 10651 CRC32 0x7776e429        Write_rows: table id 63 flags: STMT_END_F

BINLOG '
Xfd7ZRMBAAAALQAAAHApAAAAAD8AAAAAAAEABHRlc3QAAnQxAAEDAAFfKlqt
Xfd7ZRcBAAAAKwAAAJspAAAAAD8AAAAAAAEAAf/+AQAAAP4CAAAAKeR2dw==
'/*!*/;
# Number of rows: 2
# at 10651
#231215  7:51:15 server id 1  end_log_pos 10682 CRC32 0xd80bfbaf        Xid = 315
COMMIT/*!*/

字符串
;

相关问题