mysql 2003错误,涉及“mysql 临时表,内存表”、“mysql的配置my.ini”,“max_connections”,请教达人

用户昵称不能为空 2010-10-08 04:07:05
现在的问题:一个网页游戏,开广告游客模式,2小时之内同时数万人涌入(平均每秒钟数百人),出现情况 PHP连接不上数据库,错误代码 2003。

涉及服务器:服务器Server-Root
服务器中的数据库 DB-ACC,DB-PHP


所存放的主机的配置概述:

系统:WIN NT
mysql版本:mysql 5.1
内存使用:826M / 18168M
CPU使用:3%


此主机上的mysql的my.ini的配置(my.ini全部):

[client]
port=3306
[mysql]

default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="C:/Program Files/MySQL/MySQL Server 5.1/Data/"

default-character-set=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

max_connections=100
query_cache_size=0
table_cache=256

tmp_table_size=103M

thread_cache_size=8
myisam_max_sort_file_size=100G

myisam_max_extra_sort_file_size=100G

myisam_sort_buffer_size=205M
key_buffer_size=175M

read_buffer_size=64K
read_rnd_buffer_size=256K

sort_buffer_size=256K

innodb_additional_mem_pool_size=7M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=3499K

innodb_buffer_pool_size=339M
innodb_log_file_size=170M
innodb_thread_concurrency=18

skip-name-resolve



我在我自己的机子上安装了两个mysql,一个是appserv自带的(端口3306),一个是另外单独安装的mysql(端口3307),他们三个之间的my.ini文件的全部内容发现根本就不一样,而且相差很大:

本机3306端口的:

[client]
port=3306
[mysql]
default-character-set = utf8

[mysqld]

port=3306

basedir="D:\AppServ/MySQL"

datadir="D:\AppServ/MySQL/data/"
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

max_connections=16384
query_cache_size=0table_cache=256

tmp_table_size=9Mthread_cache_size=8

myisam_max_sort_file_size=100G

myisam_max_extra_sort_file_size=100G

myisam_sort_buffer_size=17Mkey_buffer_size=10Mread_buffer_size=64K
read_rnd_buffer_size=256K

sort_buffer_size=256K
log-slow-queries=mysql-slow.log
log-error=mysql.errskip-innodbinnodb_additional_mem_pool_size=2Minnodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1Minnodb_buffer_pool_size=17Minnodb_log_file_size=10M
innodb_thread_concurrency=8



本机3307端口的:

[client]
port=3307
[mysql]

default-character-set=utf8
[mysqld]
port=3307
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/"

default-character-set=utf8
default-storage-engine=INNODB

max_connections=800
query_cache_size=84M
table_cache=1520

tmp_table_size=30M

thread_cache_size=38
myisam_max_sort_file_size=100G

myisam_sort_buffer_size=30M
key_buffer_size=13M

read_buffer_size=64K
read_rnd_buffer_size=256K

sort_buffer_size=256K

innodb_additional_mem_pool_size=10M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=5M

innodb_buffer_pool_size=474M
innodb_log_file_size=95M
innodb_thread_concurrency=8




问题一:我发现主机上的那个mysql配置里面“max_connections=100”,这个值是否是太小了?另外远程主机上的mysql还有几个,比如“query_cache_size=0”,为什么设置为0?该如何优化下,不然下次还可能出现 2003无法连接到数据库里面的问题。
问题二:我用PHP除了进行用户登录外,还有统计在线人数的,我建立了表session,但是他的存储类型是MyISAM,我在网上搜索说用内存表就最好,将他转换为内存表就是直接修改它的存储类型就可以了对吗?
 ALTER TABLE `session`  ENGINE = memory 

使用的话,就跟使用MyISAM表一样使用对吗?
表session结构(无自动递增):

mysql> desc `session`;
+-------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+-------+
| userid | int(10) unsigned | NO | PRI | 0 | |
| ip | varchar(20) | NO | | NULL | |
| firstactive | int(10) unsigned | NO | | 0 | |
| lastactive | int(10) unsigned | NO | | 0 | |
+-------------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)



帮我分析分析,怎样优化下,另外我觉得那个 max_connections 的值确实需要设置大一点,我本地的mysql一个设置为 800,一个是设置的16384,如果设置大了是否对服务器有什么影响?那个session表是每个用户每隔30秒update一次的,语句
update `session` set lastactive=unix_timestamp() where userid='$userid' limit 1 

...全文
893 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihualt 2011-05-15
  • 打赏
  • 举报
回复
我今天一大早起来也遇到了,我明天要上交系统了,今天却遇到2003错误,我用遍了论坛里所有的方法都没用,包括那些更改my.ini,第一步第二步第三步神马的方法。我绝望了,我准备重装的时候,又试了一下,诶,我把它修好了,好开心。
方法:
开始->MySql->MySql Server Instance Config Wizard,然后选择重新配置,下面一步一步做下来就好了,最后执行一遍,我的数据库又出来了
  • 打赏
  • 举报
回复
真的成为了一道死题了吗?
  • 打赏
  • 举报
回复
那天的结果出来了,中午数小时很多人都被堵在外面进不来,因为数据库连接不上,错误代码 2003.
偶偶才一两个人能够挤进来,去查看MySQL的show processlist,却发现就两个连接进程而已。
rucypli 2010-10-18
  • 打赏
  • 举报
回复
每个连接用需要的内存*连接数+innodb占用的内存+myisam占用的内存+系统需要的内存<物理内存
  • 打赏
  • 举报
回复
过一天会测10万人涌入的,感觉很没信心啊,估计PHP承受不了。
但是discuz却可以承受。

不知道结果会怎么样,只改了下那个 max_connections 的值,其他的什么都没变。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 default7 的回复:]

引用 1 楼 acmain_chm 的回复:

100 有些小了。 (平均每秒钟数百人)

引用如果设置大了是否对服务器有什么影响?内存需求变大。


引用那个session表是每个用户每隔30秒update一次的,如果这么高的频率刷新,数万人涌入的话,则不建议使用数据库来实现,还不如直接在程序中维护一个数组省事。


呃,,帖子不能编辑了。
---------------……
[/Quote]

算错了,2小时同时进入了约2万人
那么就是每秒钟进入 (2*10*1000)/(3600*2) ≈ 5 人。
但是出现了 2003 错误,另外我觉得 远程主机上面的那个 max_connections 确实应该设置大一点,另外那台主机上面PHP应该没有用内存的,因为我写的PHP里面没用到机子内存,C++写的在用。


  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

100 有些小了。 (平均每秒钟数百人)

引用如果设置大了是否对服务器有什么影响?内存需求变大。


引用那个session表是每个用户每隔30秒update一次的,如果这么高的频率刷新,数万人涌入的话,则不建议使用数据库来实现,还不如直接在程序中维护一个数组省事。
[/Quote]

呃,,帖子不能编辑了。
------------------------------------------------------------------
其他方面:帮我分析分析,怎样优化下,另外我觉得那个 max_connections 的值确实需要设置大一点,我本地的mysql一个设置为 800,一个是设置的16384,如果设置大了是否对服务器有什么影响?那个session表是每个用户每隔30秒update一次的,语句
update `session` set lastactive=unix_timestamp() where userid='$userid' limit 1 
(玩家一进入游戏的网页就开始计入session在线表,然后一退出就从session表中删除记录,网页中使用Ajax每隔30秒发送一次HTTP请求一个update.php网页,来更新其最后在线时间)

------------------------------------------------------------------

但是如何直接在PHP里面使用一个程序来维护一个数组呢?
因为PHP对于一个文件不能同时的读写的。而且如果锁定的话,那么就不能准确的统计了。
其实开广告的时候同时涌入的最高人数应该是在 100~200人左右,每秒。
ACMAIN_CHM 2010-10-08
  • 打赏
  • 举报
回复
100 有些小了。 (平均每秒钟数百人)

[Quote]如果设置大了是否对服务器有什么影响?[/Quote]内存需求变大。


[Quote]那个session表是每个用户每隔30秒update一次的,[/Quote]如果这么高的频率刷新,数万人涌入的话,则不建议使用数据库来实现,还不如直接在程序中维护一个数组省事。

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧