mysql - Tomcat JDBC 连接池通过 XtraBackup 达到最大容量

标签 mysql tomcat jdbc connection-pooling database-backups

我正在尝试使用 XtraBackup 在生产数据库上制定托管备份方案。

根据我们的 DBA 的说法,XtraBackup 不会锁定数据库,而是发出一系列 SHOW TABLE STATUS 命令,然后在文件系统级别上工作。

不过,就在 XtraBackup 运行时,我的日志开始因连接池错误而爆炸:

获取数据库连接时出错:[http-nio-8080-exec-5] 超时:池为空。无法在 10 秒内获取连接,无可用[size:100;忙碌:100;空闲:0; lastwait:10000].

有人建议关闭 innodb-stats-on-metadata 可能会有帮助,所以我们正在尝试。

同时我想确认我的连接池设置是否正确:

<Resource name="jdbc/mydatabase_master"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="100"
          minIdle="10"
          maxWait="10000"
          initialSize="10"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          minEvictableIdleTimeMillis="30000"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="db_user"
          password="mypassword"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://my.ip:3306/my_database"
          />

对于除备份之外的所有内容,此配置都非常有效。在我们的大部分流量下,连接池大小徘徊在 initialSize 附近。似乎将 maxActive 设置得更高只会在池中产生挂起的新连接。

与 XtraBackup 相关的任何其他似乎可以调整的地方?

最佳答案

四处询问后,问题似乎是 XtraBackup 给数据库服务器带来的压力。虽然 XtraBackup 不对所有 InnoDB 数据库使用锁定,但它仍然会给系统带来压力。来自文档

"Although innobackupex does not block your database’s operation, any backup can add load to the system being backed up. On systems that do not have much spare I/O capacity, it might be helpful to throttle the rate at which innobackupex reads and writes InnoDB data. You can do this with the --throttle option."

此时我们最终只是提高了 maxActive 而不是选择节流。当 XtraBackup 最初运行时,查询足以减慢数据库速度,导致线程池达到最大值。添加更高级别的 maxActive 连接允许 XtraBackup 在不最大化连接池的情况下运行。

似乎将 innodb-stats-on-metadata 关闭有助于加快 SHOW TABLE STATUS 查询,进一步降低数据库的压力。

有点特殊情况,但希望这对处于相同情况的任何人都有帮助。

关于mysql - Tomcat JDBC 连接池通过 XtraBackup 达到最大容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26317727/

相关文章:

mysql - 根据列内容选择单行结果

python - SQLAlchemy - 如何获取1分钟以内的所有记录和最新记录的同一分钟?

java - JavaMelody 和 ab 中的 tomcat 性能监控

apache - JSP:获取观众的IP

java - JComboBox 中的 MySQL 表值

php - 如何使子列的名称按字母顺序排列?

eclipse - Merve 在每次启动 Tomcat 时构建 Maven 项目

jdbc - Logstash 'com.mysql.jdbc.Driver' 未加载

java - JDBC 驱动程序中的 Statement、PreparedStatement 和 CallableStatement 的 ExecuteUpdate 实现是否不同?

mysql - 无法导入或链接 MySQL - ODBC 调用失败