我正在尝试使用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
查询,从而进一步减轻了数据库的负担。
有点特殊情况,但希望这对任何人处于相同情况都可以有所帮助。