拆分数据库感觉更多还是应该从业务上去拆分. 那么我们需要业务方协助, 由他们细化业务类别. 之后DBA要做的是如何合理分配资源
如何平衡资源
有时候一个数据库实例一拆就能拆除10几个业务. 那么可能对于10几个数据库实例. 如何部署这些实例呢, 如果只是单纯的10*3去部署高可用集群就需要占用30多台服务器,成本有点高. 那么可能就会需要在服务器上部署多实例. 如何合理的分配资源就成了一个问题. 因为如果不加考虑的话就可能将比较吃资源的实例(或比较闲的实例)部署到了一起
使用如下SQL可以统计每个实例表的读写请求量, 作为判断负载的依据
select table_name,rows_fetched,rows_inserted,rows_updated,rows_deleted,io_read_requests,io_read,io_write_requests,io_write from sys.schema_table_statistics order by io_read_requests desc limit 10;
如何合理设置innodb_buffer_pool_size
拆分后如何合理设置每个实例的innodb_buffer_pool_size也成了问题. 还好有sys库, 通过查看sys.schema_table_statistics_with_buffer的创建语句, 我们可以使用下面的SQL
select
`pst`.`OBJECT_SCHEMA` AS `table_schema`,
`pst`.`OBJECT_NAME` AS `table_name`,
`pst`.`COUNT_FETCH` AS `rows_fetched`,
`pst`.`COUNT_INSERT` AS `rows_inserted`,
`pst`.`COUNT_UPDATE` AS `rows_updated`,
`pst`.`COUNT_DELETE` AS `rows_deleted`,
`fsbi`.`count_read` AS `io_read_requests`,
`sys`.`format_bytes`(`fsbi`.`sum_number_of_bytes_read`) AS `io_read`,
`fsbi`.`count_write` AS `io_write_requests`,
`sys`.`format_bytes`(`fsbi`.`sum_number_of_bytes_write`) AS `io_write`,
`fsbi`.`count_misc` AS `io_misc_requests`,
`sys`.`format_bytes`(`ibp`.`allocated`) AS `innodb_buffer_allocated`,
`ibp`.`allocated`,
`sys`.`format_bytes`(`ibp`.`data`) AS `innodb_buffer_data`,
`ibp`.`data`,
`sys`.`format_bytes`((`ibp`.`allocated` - `ibp`.`data`)) AS `innodb_buffer_free`,
`ibp`.`pages` AS `innodb_buffer_pages`,
`ibp`.`pages_hashed` AS `innodb_buffer_pages_hashed`,
`ibp`.`pages_old` AS `innodb_buffer_pages_old`,
`ibp`.`rows_cached` AS `innodb_buffer_rows_cached`
from
(
(
`performance_schema`.`table_io_waits_summary_by_table` `pst`
left join `sys`.`x$ps_schema_table_statistics_io` `fsbi` on(
(
(`pst`.`OBJECT_SCHEMA` = `fsbi`.`table_schema`)
and (`pst`.`OBJECT_NAME` = `fsbi`.`table_name`)
)
)
)
left join `sys`.`x$innodb_buffer_stats_by_table` `ibp` on(
(
(`pst`.`OBJECT_SCHEMA` = `ibp`.`object_schema`)
and (`pst`.`OBJECT_NAME` = `ibp`.`object_name`)
)
)
) where `pst`.`OBJECT_SCHEMA`='mafengwo' and `pst`.`OBJECT_NAME` in ('sales_order_process_last','sales_traveller_field_way','sales_traveller_template','sales_traveller_template_map','sales_traveller_template_map_role','sales_traveller_template_mdd')
order by `pst`.`OBJECT_NAME`
使用EXCEL整理信息
记录公式
=IF(VLOOKUP(D3,Sheet1!B:O,14,0)="NULL",0,VLOOKUP(D3,Sheet1!B:O,14,0))
D3是表名, Sheet1是通过上面查内存的SQL查到的结果B是表名列O是ibp.data, 14就是说是第14列