linux下shm是一种完美的内存磁盘虚拟技术, 你可以指定一个shm盘的大小, 但实际的占用不会固定为设置的大小,而是随着里面文件的大小,占用相应的宝贵的mem空间. 这些mem在也会在必要时被系统交换到硬盘上面去. 下面是使用shm虚拟存储将mysql的库运行在内存中的一个实例.
debian在默认下,/dev/shm建立虚拟存储,在/etc/default/tmpfs文件中可以修改shm的大小.
或者用命令 mount tmpfs /dev/shm -t tmpfs -o size=128m来建立shm虚拟存储.
好了,我们首先建立/dev/shm/php4 用于php的session 和tmp目录, 修改它的用户和组为www-data,以及访问权限700 修改php.ini让它们指向/dev/shm/php4. 还要修改apache2的启动脚本,让apache2启动之前,检查/dev/shm/php4是否存在,并建立.
mysql 的存储目录在/var/lib/mysql,一个库一个文件目录,如果只想让某些库运行在内存中,可以把相应目录用符号联接的方式,放到/dev/shm,
还有数据的备份和恢复,因为shm在关机后会丢失.所以应该在mysql的启动脚本,建立shm下的目录,并从备份复制文件到shm,在关闭脚本中,应该复制shm的数据到备份目录.
以anheng这个表为例,首先关闭mysql,以便直接操作/var/lib/mysql的文件,
关闭mysql
/etc/init.d/mysql stop
开备份目录/var/lib/mysql/anheng0
mkdir /var/lib/mysql/anheng0
chown mysql:mysql /var/lib/mysql/anheng0
chmod 770 /var/lib/mysql/anheng0
复制数据
cp /var/lib/mysql/anheng/* /var/lib/mysql/anheng0
chown mysql:mysql /var/lib/mysql/anheng0/*
chmod 770 /var/lib/mysql/anheng0/*
移动所有的数据到shm
mv /var/mysql/anheng /dev/shm/anheng
建立符号联接
ln -s /dev/shm/anheng /var/lib/mysql/anheng
启动mysql
/etc/init.d/mysql start
下一步修改/etc/init.d/mysql在启动部分最前面增加shm开目录和复制,要保证在mysql启动之前进行复制
if [ ! -e /dev/shm/anheng ]
then
echo mkdir /dev/shm/anheng
mkdir /dev/shm/anheng
chown mysql:mysql /dev/shm/anheng
chmod 770 /dev/shm/anheng
cp /var/lib/mysql/anheng0/* /dev/shm/anheng
chown mysql:mysql /dev/shm/anheng/*
chmod 660 /dev/shm/anheng/*
fi
在关闭部分最后面增加备份shm的脚本,要保证关闭之后再复制
cp /dev/shm/anheng/* /var/lib/mysql/anheng0
chown mysql:mysql /var/lib/mysql/anheng/*
chmod 660 /var/lib/mysql/anheng/*
还要增加定时任务,定时用mysqldump从anheng库向anheng0库覆盖数据.防止突然关机造成的数据丢失.
如果有一台远程的mysql服务器,对anheng库进行热备份,就更完美了.具体配置方式在 mysql热备份