用循環(huán)讀取后面的記錄:
十載的柘城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整柘城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“柘城網(wǎng)站設(shè)計(jì)”,“柘城網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
計(jì)次循環(huán)首 (取記錄集行數(shù) (記錄集句柄), 計(jì)次)
讀字段值 (記錄集句柄, “在線用戶”, 賬號(hào)ID)
調(diào)試輸出 (賬號(hào)ID)
到下一行 (記錄集句柄)
計(jì)次循環(huán)尾 ()
1、MySQL處在高負(fù)載環(huán)境下,磁盤IO讀寫過多,肯定會(huì)占用很多資源,CPU會(huì)占用過高 需要優(yōu)化。 2、設(shè)備升級(jí)。
一看你就是做 魔域或征服注冊(cè)程序的,,不過魔域的密碼都是特定的MD5密,不能用明密碼的。要用到腳本調(diào)試才行,,這個(gè)做起來就不容易了。
先說你的問題吧:
定義一個(gè)變量為整數(shù)型,比如說:句柄:整數(shù)型;
比如你要單擊按鈕1在name插入 123,就這么寫:
句柄=連接MySQL(“MySQL地址”,“MySQL賬號(hào)”,“MySQL密碼”,“數(shù)據(jù)庫名,你的就是account”,MySQL端口,一般都是3306)
增加記錄(句柄,“account”,“name=‘123’”)
如果要同時(shí)增加name和password這兩個(gè)或更多,就按下面的寫:
增加記錄(句柄,“account”,“name=‘123’”+“,”+“password='123'”)
看看打開了幾個(gè)文件lsof | grep /home/mysql
...
mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock
mysqld 24349 mysql 6u REG 8,33 2048 30425188 /home/mysql/mysql/host.MYI
mysqld 24349 mysql 7u REG 8,33 0 30425189 /home/mysql/mysql/host.MYD
mysqld 24349 mysql 8u REG 8,33 2048 30425153 /home/mysql/mysql/user.MYI
mysqld 24349 mysql 9u REG 8,33 892 30425155 /home/mysql/mysql/user.MYD
mysqld 24349 mysql 10u REG 8,33 5120 30425126 /home/mysql/mysql/db.MYI
mysqld 24349 mysql 11u REG 8,33 3080 30425148 /home/mysql/mysql/db.MYD
mysqld 24349 mysql 12u REG 8,33 4096 30425154 /home/mysql/mysql/tables_priv.MYI
mysqld 24349 mysql 13u REG 8,33 0 30425157 /home/mysql/mysql/tables_priv.MYD
mysqld 24349 mysql 14u REG 8,33 4096 30425143 /home/mysql/mysql/columns_priv.MYI
mysqld 24349 mysql 15u REG 8,33 0 30425156 /home/mysql/mysql/columns_priv.MYD
mysqld 24349 mysql 16u REG 8,33 4096 30425127 /home/mysql/mysql/procs_priv.MYI
mysqld 24349 mysql 17u REG 8,33 0 30425136 /home/mysql/mysql/procs_priv.MYD
mysqld 24349 mysql 18u REG 8,33 1024 30425173 /home/mysql/mysql/servers.MYI
mysqld 24349 mysql 19u REG 8,33 0 30425174 /home/mysql/mysql/servers.MYD
mysqld 24349 mysql 20u REG 8,33 2048 30425182 /home/mysql/mysql/event.MYI
mysqld 24349 mysql 21u REG 8,33 0 30425183 /home/mysql/mysql/event.MYD
...
可以看到,總共打開了8個(gè)表,每個(gè)表分別有2個(gè)文件描述符,看來沒錯(cuò)。
3. 再來看 status 結(jié)果
mysqlshow global status like 'open_%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Open_files | 17 |
| Open_streams | 0 |
| Open_table_definitions | 15 |
| Open_tables | 8 |
| Opened_files | 52 |
| Opened_tables | 15 |
+------------------------+-------+
4. flush tables 后再看看
mysqlflush tables;
mysql show global status like 'open_%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Open_files | 1 |
| Open_streams | 0 |
| Open_table_definitions | 0 |
| Open_tables | 0 |
| Opened_files | 52 |
| Opened_tables | 15 |
mysql show global status like 'open_%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Open_files | 1 |
| Open_streams | 0 |
| Open_table_definitions | 0 |
| Open_tables | 0 |
| Opened_files | 52 |
| Opened_tables | 15 |
+------------------------+-------+lsof | grep /home/mysql
...
mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock
mysqld 24349 mysql 22u unix 0x00000102378ff980 4244128 /home/mysql/mysql.sock
...
可以看到,flush 之后,所有的文件描述符都釋放了。
通過測(cè)試可以得知,另一個(gè)打開的文件描述符是 slow query log所用。
如果是有大量的 MyISAM 表,那么就需要特別注意打開文件數(shù)是否會(huì)超出限制了。
二、原理
接下來仔細(xì)了解下這個(gè)最大文件數(shù)相關(guān)的參數(shù):
table_cache (新版本改成了 table_open_cache) The number of cached open tables.
open_files_limit If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit().
If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger)
number of files.
如果 open_files_limit 不是設(shè)置為 0,則以 setrlimit() 函數(shù)計(jì)算后的結(jié)果為準(zhǔn),如果設(shè)置為 0,則實(shí)際值是 max_connections*5 或 max_connections + table_cache*2 中的最大者。
因此,想要解決打開文件數(shù)超限的問題,還需要綜合系統(tǒng)內(nèi)核限制(ulimit -n),mysqld自身限制(open_files_limit),以及表緩存數(shù)(table_open_cache)等多方面因素。
不過,實(shí)際測(cè)試中,發(fā)現(xiàn)卻不是這樣的,open_files_limit采用了內(nèi)核的最大限制,而非上面的計(jì)算結(jié)果。
. 查看內(nèi)核限制
ulimit -n
65535
2. 修改 my.cnf 限制
vi /etc/my.cnf
...
open_files_limit = 10000
...
3. 重啟 mysqld
/etc/init.d/mysql restart
4. 查看結(jié)果
mysqlshow global variables like '%open%';
| open_files_limit | 65535 |
| table_open_cache | 1000 |
5. 不設(shè)置 open_files_limit 看看
vi /etc/my.cnf
...
#open_files_limit = 10000
...
重啟
/etc/init.d/mysql restart
查看
mysqlshow global variables like '%open%';
| open_files_limit | 65535 |
| table_open_cache | 1000 |
而這個(gè)時(shí)候,按計(jì)算公式結(jié)果如下:
| max_connections | 100 |
| table_open_cache | 1000 |
來計(jì)算一下:
max_open_files_1 = max_connections + table_cache * 2 = 100 + 1000 * 2 = 2100
max_open_files_2 = max_connections*5 = 100 * 5 = 500
6. 修改 ulimit 試試看:
unlimit -n 5000
vi /etc/my.cnf
...
open_files_limit = 10000
...
/etc/init.d/mysql restart
mysqlshow global variables like '%open%';
| open_files_limit | 10000 |
| table_open_cache | 1000 |
open_files_limit 比內(nèi)核最大限制數(shù)還大,因此以 open_files_limit 為準(zhǔn)。
vi /etc/my.cnf
...
#open_files_limit = 10000
...
/etc/init.d/mysql restart
mysqlshow global variables like '%open%';
| open_files_limit | 5000 |
| table_open_cache | 1000 |
看到了,變成了新的內(nèi)核最大限制
看到了吧,結(jié)果完全跟文檔描述的以及mysql源碼中寫的不一樣,看來預(yù)編譯版本有些地方不太可靠啊 :(
以上測(cè)試在mysql 5.1.23-rc(預(yù)編譯), mysql-5.1.24-rc(自編譯) 以及 5.0.45(預(yù)編譯) 均一樣。
uname -a
Linux s1.yejr.com 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
mysql select version();
+---------------+
| version() |
+---------------+
| 5.1.23-rc-log |
+---------------+
================= 222222222222=========
mysql Lost Connection During Query 問題解決方法2008-07-25 14:45這是在使用 mysql 的過程中,困擾我很久的一個(gè)問題,今天終于找到根本原因,得以徹底解決,真是可喜可賀啊!下面詳細(xì)地總結(jié)一下:?jiǎn)栴}描述:在使用 mysql 的過程中發(fā)現(xiàn),偶爾的查詢或一段時(shí)間內(nèi)的登錄會(huì)失敗,返回的錯(cuò)誤提示信息為:Lost Connection During Query。問題定位:這個(gè)問題在半年、甚至一年前都遇到過,由于它不是必現(xiàn),往往你去看的時(shí)候沒法重現(xiàn),并且一個(gè) mysql server 管理好多個(gè)數(shù)據(jù)庫,查詢又不是時(shí)刻發(fā)生的,常常不知所措。無法登錄時(shí),更是束手無策。最初,比較粗暴的方法是重啟 mysql,問題在一段時(shí)間內(nèi)能緩解。后來,使用 flush tables 也能在一段時(shí)間內(nèi)緩解。再后來,通過查看 mysql 的錯(cuò)誤日志,發(fā)現(xiàn)一共有三種提示信息:第一種:080724 19:55:05 [ERROR] Error in accept: Too many open files,這種明顯是由于 mysql 打開文件個(gè)數(shù)過多,mysql 無法再“接收”新的連接進(jìn)來,也就是沒有辦法登錄,造成連接失敗。第二種:080724 19:45:11 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted,這種是放棄了排序,但沒有說明原因。第三種:080725 9:30:33 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: 'OperateRecord.MRG' (errno: 24),這種是打開文件失敗,錯(cuò)誤碼是24,通過 perror 查詢?cè)敿?xì)的錯(cuò)誤原因是:OS error code 24: Too many open files,也是打開文件過多。再通過 status 查看 mysql 的打開文件個(gè)數(shù),此時(shí)一般都接近 1000 個(gè)。再通過 show variables 查看 mysql 的配置,默認(rèn)其打開文件個(gè)數(shù)為 open_files_limit 為 2048,按道理說這個(gè)大小是足夠的。問題解決:原來 mysql 中的 open_files_limit 只是限制 mysql 這個(gè)進(jìn)程打開的最大文件個(gè)數(shù)。而內(nèi)核也會(huì)對(duì) mysql 打開的進(jìn)程數(shù)進(jìn)行限制,并且優(yōu)先級(jí)要高。通過 ulimit -a 查看 mysql 這個(gè)用戶的最大打開文件個(gè)數(shù),發(fā)現(xiàn)其值為 1024(linux 默認(rèn)都是1024)。原來,mysql 已經(jīng)打開了近 1000 個(gè)表,若再打開一個(gè) merge 表(包含100個(gè)子表),導(dǎo)致文件句柄過多而失敗。通過修改 /etc/security/limits.conf 配置文件,添加如下行:* - nofile 4096,把該限制放大,重新啟動(dòng) mysql ,問題得到徹底解決。設(shè)置 mysql 打開文件限制方法:把 set-variable=open_files_limit=10240 加到配置文件中。