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 

...全文
892 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]如果这么高的频率刷新,数万人涌入的话,则不建议使用数据库来实现,还不如直接在程序中维护一个数组省事。
话不多说直接开干   目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码     先去官网下载点击的MySQL的下载   下载完成后解压  解压完是这个样子     配置初始化的my.ini文件的文件 解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置:  [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=C:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datadir=C:\Program Files\MySQL\Data # 允许最大连接数 max_connections=200 # 允许连接失败的次数。 max_connect_errors=10 # 服务端使用的字符集默认为utf8mb4 character-set-server=utf8mb4 # 创建新时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8mb4 配置文件中的路径要和实际存放的路径一致(8.0.18不要手动创建Data文件夹)     初始化MySQL 在安装时,避免权限问题出错我们尽量使用管理员身份运行CMD,否则在安装时会报错,会导致安装失败的情况 C:\Windows\System32   右键以管理员身份运行     打开后进入mysql的bin目录   在MySQL目录下的bin目录下执行命令: mysqld --initialize --console   注意![注意] [MY-010454] [服务器]为root @ localhost生成临时密码:9P0gYk-?0,kT其中root @ localhost:后面的9P0gYk-?0,kT就是初始密码(不含首位空格)。在没有更改密码前,需要记住这个密码,后续登录需要用到。复制密码先保存起来!!! 如果出现系统错误问题            列:这个是因为缺少微软的一些运行所需的库。这个百度一下都可以找到下载源安装一下(可能需要重启  )     安装MySQL服务 + 启动MySQL 服务  安装mysql服务 执行下面的命令: mysqld --install [服务名] ###(服务名可以不加默认为mysql) 成功了! 如果出现这个 说明mysql的服务还在把它删掉     用这个命令 SC删除的MySQL 在执行上面安装服务 服务安装成功之后通过命令 net start mysql 启动MySQL的服务   总体三步走 1初始化MySQL 2创建服务 3启动服务   到这你的MySQL已经是安装好了!   连接MySQL + 修改密码 相信大家都有的Navicat,小海豚等数据库图形化工具 没有我们去Navicat官网下一个(可以免费使用14天的!) MySQL的服务已经开启了就直接打开的Navicat去连接 新建的MySQL的连接 还记得刚刚让你复制的root @ localhost:后面的初始密码了吗?现在要用到它了复制粘贴上去!(稍微注意一下空格啊) 测试一下! MySQL的是成功安装了也可以登录   现在就是改密码的时候了 也可以在mysql的bin目录下 进行数据库连接  mysql -u root -p 再输入密码   回车 有了mysql> 这个的时候  你就可以去改密码了! ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; 密码修改成功后  exit;(退出mysql) 写SQL改密码吗? 太麻烦了太low了 来我有个简单的方法 用Navicat的双击刚刚保存的连接

56,679

社区成员

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

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