我有一个在 Parallels 上运行 CentOS 的 VM 切片。
以下是输出free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 960 272 687 0 0 0
-/+ buffers/cache: 272 687
Swap: 0 0 0
这是一个 LAMP 服务器,数据库本身超过 1000 MB。
“缓冲区”和“缓存”难道不应该显示更高的值,缓存数据库文件吗?看起来只有 1/3 的内存被使用。
答案1
显示的缓冲区和缓存是从操作系统的角度看的。
要查看 MySQL 缓存的内容,您必须运行以下查询
MYSQL_CONN="-uroot -prootpassword"
BPSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size'" | awk '{print $2}'`
BPDATA=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data'" | awk '{print $2}'`
BPPAGE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Innodb_page_size'" | awk '{print $2}'`
BPDATABYTES=`echo ${BPDATA}*${BPPAGE}|bc`
BPPCTUSED=`echo ${BPDATABYTES}00/${BPSIZE}|bc`
KBSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL VARIABLES LIKE 'key_buffer_size'" | awk '{print $2}'`
KBUSED=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'Key_blocks_used'" | awk '{print $2}'`
KCSIZE=`mysql ${MYSQL_CONN} -ANe"SHOW GLOBAL STATUS LIKE 'key_cache_block_size'" | awk '{print $2}'`
KBDATABYTES=`echo ${KBUSED}*${KCSIZE}|bc`
KBPCTUSED=`echo ${KBDATABYTES}00/${KBSIZE}|bc`
echo "InnoDB Buffer Pool Size : ${BPSIZE}, (${BPPCTUSED}) Percent Full"
echo "MyISAM Key Buffer Size : ${KBSIZE}, (${KBPCTUSED}) Percent Full"
如果您想查看实际有多少数据,请运行以下命令:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size",
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A
ORDER BY TSize;
这将显示 MySQL 实例中有多少 InnoDB 和 MyISAM 数据。
请记住
- MyISAM 索引的总和是您可以为实例分配的最大 key_buffer_size
- InnoDB 数据页和索引页的总和是实例的最大 innodb_buffer_pool_size
有关如何调整 key_buffer_size 和 innodb_buffer_pool_size 大小的更多信息,请参阅我在 DBA StackExchange 上的帖子。