我们有一个专用的数据库服务器(MariaDB 5.5.31),托管我们的java应用程序使用的数据库(通过hibernate从另一台服务器访问数据库)。虽然我们的数据库本身使用了大约12GB的RAM,但操作系统(CentOS 6.4)还在缓存大约25gb。
你能给我任何建议,我们如何影响这种行为?
虽然我们的100个表中的大多数表都少于1000个,但我们有一些表超过1000万。这些表经历了大量的读写操作。
这些是我们的数据库设置:
[server]
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server = utf8
collation-server=utf8_general_ci
skip-external-locking
back_log = 50
max_connections = 100
max_connect_errors = 10
table_open_cache = 2048
max_allowed_packet = 16M
max_heap_table_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 16M
thread_cache_size = 8
thread_concurrency = 8
query_cache_size = 128M
query_cache_limit = 2M
thread_stack = 240K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 64M
binlog_cache_size = 1M
log-bin=mysql-bin
binlog_format=mixed
expire_logs_days = 2
#*** MyISAM Specific options
key_buffer_size = 384M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
# *** INNODB Specific options ***
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 10G
innodb_data_home_dir = /var/lib/mysql
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
[embedded]
[mysqld-5.5]
[mariadb]
[mariadb-5.5]
答案 0 :(得分:0)
如果具有数百万条记录的表是事务表,那么以下是最重要的事情:
如果有很多子表的数据可以备份,那么有2个选项:
a)为备份数据准备一个非规范化表
b)每个表都可以命名为original_table_name_bk
应该每隔3个月定期计划一次备份流程,最好在精益期间流程运行并将数据从事务表移动到备份表。
现在,您在数据库中同时拥有历史数据和当前数据,而不会影响事务操作的性能。