服务器的进程中mysqld的内存和虚拟内存在持续增长,增长的不快,大概半个小时1M的样子,持续不断的增长。
期间我在不断的往库中插入数据,删除数据,且频率比较高。
请问这是什么原因?
谢谢。

解决方案 »

  1.   

    数据库插入.删除这些sql操作不会直接马上刷写到磁盘的,会先放到内存中,再通过相应的刷写机制写到磁盘,我认为是这个原因.
      

  2.   

    如果是没有提交事物,不应该持续增长吧   这个增长很稳定,大概半个小时1m的样子
    wait_timeout我已经设为20了,Threads_connected一直小于10  
      

  3.   

    各位大侠,我的mysql运行了一个周末了,其中一台内存从56M涨到了156M,虚拟内存也从308M涨到了407M,另外三台全死掉了,但是错误日志上什么都没有,最后一条记录是我连上数据库的记录。
    110108 14:50:15 [Note] D:\MySQL\bin\mysqld: ready for connections.
    Version: '5.1.46-community'  socket: ''  port: 3306  MySQL Community Server (GPL)
      

  4.   

    我遇到过类似的问题,产品刚上线,mysql一直不段增加,不过后面之后就稳定了,分离了一些读和写,楼主可以适当的调整下mysql的参数,可以减少内存的消耗,比如:read_buffer_size.read_rnd_buffer_size;bulk_insert_buffer_size ....
      

  5.   

    我用的都是myisam表,机器是2G内存,主要是做插入删除操作。各个参数应该如何设置,能给个建议吗?该机器并不是专门的数据库服务器,同时还要跑其他的应用的。
      

  6.   

    你就拿有个默认的数据库的配置模板来用就可以了,不过在其基础上再把key_Buffer_size 设置的小点,加大点bulk_insert_buffer_size
      

  7.   

    mysql版本是5.1.46   os是windows xp   我在my.ini中只能找到key_Buffer_size ,但是并不能找到bulk_insert_buffer_size,那请问这个参数如何设置呢?
      

  8.   

    show status like '%insert%';这个也查不到这个参数。
      

  9.   

    是variables 系统变量,不是看状态.
      

  10.   

    bulk_insert_buffer_size =64M
    #MyISAM 使用特殊的类似树的cache来使得突发插入 (这些插入是,INSERT SELECT, INSERT VALUES (), (), , 以及 LOAD DATA INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.设置为 0 会关闭此优化为了最优化不要将此值设置大于 “key_buffer_size”.要是只有myisam的话,我是设置成64的;
      

  11.   

    bulk_insert_buffer_size  和key_buffer_size都设置成64,跑了1个小时,还是涨了2M这个涨下去,会不会涨了key_buffer_size(64M)就不涨了啊?明天早上在看吧
      

  12.   

    7.5.5. MySQL如何使用内存
    下面的列表中列出了mysqld服务器使用内存的一些方法。在适用的地方,给出了内存相关的系统变量名:·         键缓存(变量key_buffer_size)被所有线程共享;服务器使用的其它缓存则根据需要分配。参见7.5.2节,“调节服务器参数”。·         每个连接使用具体线程的空间:o        堆栈(默认64KB,变量thread_stack)o        连接缓存区(变量net_buffer_length)o        结果缓存区(变量net_buffer_length)连接缓存区和结果缓存区可以根据需要动态扩充到max_allowed_packet。当某个查询运行时,也为当前查询字符串分配内存。·         所有线程共享相同的基本内存。·         只有压缩MyISAM表映射到内存。这是因为4GB的32位内存空间不足以容纳大多数大表。当64位地址空间的系统变得越来越普遍后,我们可以增加常规的内存映射支持。·         对表进行顺序扫描的请求将分配一个缓存区(变量read_buffer_size)。·         当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读 缓存区(变量read_rnd_buffer_size)以避免硬盘搜索。·         所有联合在一个令牌内完成,并且大多数联合甚至可以不用临时表即可以完成。大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置mysqld的tmp_table_size选项来增加临时表的大小,或设置客户程序中的SQL选项SQL_BIG_TABLE。参见13.5.3节,“SET语法”。·         进行排序的大多数请求将分配一个排序缓存区,并根据结果集的大小为两个临时文件分配零。参见A.4.4节,“MySQL将临时文件储存在哪里”。·         几乎所有解析和计算在局部内存中完成。小项目不需要内存,因此避免了普通的慢内存分配和释放。只为不期望的大字符串分配内存;使用函数malloc()和free()来完成。·         对于每个打开的MyISAM表,索引文件打开一次;数据文件为每个并行运行的线程打开一次。对于每个并行线程,将分配一个表结构、一个每个列的列结构和大小为3 * N的缓存区(其中N是最大行的长度,而不是计算BLOB列)。一个BLOB列需要5至8个字节加上BLOB数据的长度。MyISAM 存储引擎维护一个额外的行缓存区供内部应用。·         对于每个具有BLOB列的表,将对缓存区进行动态扩大以读入大的BLOB 值。如果你扫描一个表,则分配一个与最大的BLOB值一样大的缓存区。·         所有使用的表的句柄结构保存在高速缓存中并以FIFO管理。默认情况,高速缓存有64个入口。如果某个表同时被两个运行的线程使用,高速缓存则为该提供两个入口。参见7.4.9节,“MySQL如何打开和关闭表”。·         当并行执行的线程结束时,FLUSH TABLE语句或mysqladmin flush-table命令可以立即关闭所有不使用的表并将所有使用中的表标记为已经关闭。这样可以有效释放大多数使用中的内存。FLUSH TABLE在关闭所有表之前不返回结果。ps和其它系统状态程序可以报导mysqld使用很多内存。这可以是在不同的内存地址上的线程栈造成的。例如,Solaris版本的ps将栈间未用的内存算作已用的内存。你可以通过用swap -s检查可用交换区来验证它。我们用商业内存漏洞探查器测试了mysqld,因此应该有没有内存漏洞。
      

  13.   

    楼主要是只用与insert 来保存数据的话,不做其他操作就设置最小的;
    用my-small 这个模板来用下,试试什么情况;除了myisam存储引擎,其他的存储引擎都skip掉;
      

  14.   

    my-small这个模板,楼上的大侠能提供吗?网上找了半天没找到,谢谢
      

  15.   

    你mysql装好就自带有这个模块的.
    # Example MySQL config file for small systems.
    #
    # This is for a system with little memory (<= 64M) where MySQL is only used
    # from time to time and it's important that the mysqld daemon
    # doesn't use much resources.
    #
    # You can copy this file to
    # /etc/my.cnf to set global options,
    # mysql-data-dir/my.cnf to set server-specific options (in this
    # installation this directory is C:\mysql\data) or
    # ~/.my.cnf to set user-specific options.
    #
    # In this file, you can use all long options that a program supports.
    # If you want to know which options a program supports, run the program
    # with the "--help" option.# The following options will be passed to all MySQL clients
    [client]
    #password = your_password
    port = 3306
    socket = /tmp/mysql.sock# Here follows entries for some specific programs# The MySQL server
    [mysqld]
    port = 3306
    socket = /tmp/mysql.sock
    skip-locking
    key_buffer_size = 16K
    max_allowed_packet = 1M
    table_open_cache = 4
    sort_buffer_size = 64K
    read_buffer_size = 256K
    read_rnd_buffer_size = 256K
    net_buffer_length = 2K
    thread_stack = 128K# Don't listen on a TCP/IP port at all. This can be a security enhancement,
    # if all processes that need to connect to mysqld run on the same host.
    # All interaction with mysqld must be made via Unix sockets or named pipes.
    # Note that using this option without enabling named pipes on Windows
    # (using the "enable-named-pipe" option) will render mysqld useless!

    #skip-networking
    server-id = 1# Uncomment the following if you want to log updates
    #log-bin=mysql-bin# binary logging format - mixed recommended
    #binlog_format=mixed# Uncomment the following if you are using InnoDB tables
    #innodb_data_home_dir = C:\mysql\data/
    #innodb_data_file_path = ibdata1:10M:autoextend
    #innodb_log_group_home_dir = C:\mysql\data/
    # You can set .._buffer_pool_size up to 50 - 80 %
    # of RAM but beware of setting memory usage too high
    #innodb_buffer_pool_size = 16M
    #innodb_additional_mem_pool_size = 2M
    # Set .._log_file_size to 25 % of buffer pool size
    #innodb_log_file_size = 5M
    #innodb_log_buffer_size = 8M
    #innodb_flush_log_at_trx_commit = 1
    #innodb_lock_wait_timeout = 50[mysqldump]
    quick
    max_allowed_packet = 16M[mysql]
    no-auto-rehash
    # Remove the next comment character if you are not familiar with SQL
    #safe-updates[myisamchk]
    key_buffer_size = 8M
    sort_buffer_size = 8M[mysqlhotcopy]
    interactive-timeout
    ==================楼主适当的加一下bulk_insert_buffer_size 的大小;和相应的sock地址,否则你的mysql可能开不起来;最好用你自己的自带的;
      

  16.   

    请问你只是改了这两个参数,内存就没有再涨了吗?
    我讲key_buffer_size和bulk_insert_buffer_size 均调为64M。跑了一个晚上,内存还是在涨 啊。
      

  17.   

    内存还涨的呀,只是会释放,释放后就正常了,楼主你的情况就只有写(insert);有几个线程在并发?
      

  18.   


    怎么看有几个线程在并发?
    threads_connected=8
      

  19.   

    有间隙,而且我是批量插入的
    刚才半个小时的样子,mysqld的内存从31涨到33,虚拟内存从277涨到了279还在涨啊
      

  20.   

    不会是我的mysql的版本问题吧
      

  21.   

    如果我把那个向mysql喂数据的应用程序停下来,内存会迅速降下来。