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

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

尽管如此,就像XtraBackup运行时一样,我的日志开始因连接池错误而崩溃:

Error getting database connection:[http-nio-8080-exec-5] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:100; busy:100; idle: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数据库上使用锁定,但仍然给系统带来压力。从文档中


  “尽管innobackupex不会阻止您数据库的操作,但是任何
  备份会给正在备份的系统增加负载。在可以的系统上
  没有太多的备用I / O容量,可能有助于限制
  innobackupex读取和写入InnoDB数据的速率。你可以做
  加上--throttle选项。”


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

看来,将innodb-stats-on-metadata设置为OFF也有助于加快SHOW TABLE STATUS查询,从而进一步减轻了数据库的负担。

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

10-07 23:34