我的mysql4.1.21的/etc/my.cnf设置

老是忘记怎样设置默认字符集和默认数据目录,干脆把我的/etc/my.cnf帖在这里备忘。没办法,忘性太好了。


# 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 /var/lib/mysql) 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]

default_character_set=utf8

#password = your_password

port = 3306

socket = /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server

[mysqld]

datadir=/var/lib/mysql/

default_character_set=utf8

port = 3306

socket = /var/lib/mysql/mysql.sock

skip-locking

key_buffer = 16K

max_allowed_packet = 1M

table_cache = 4

sort_buffer_size = 64K

read_buffer_size = 256K

read_rnd_buffer_size = 256K

net_buffer_length = 2K

thread_stack = 64K

# 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

# Uncomment the following if you are NOT using BDB tables

#skip-bdb

# Uncomment the following if you are using InnoDB tables

#innodb_data_home_dir = /var/lib/mysql/

#innodb_data_file_path = ibdata1:10M:autoextend

#innodb_log_group_home_dir = /var/lib/mysql/

#innodb_log_arch_dir = /var/lib/mysql/

# 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

[isamchk]

key_buffer = 8M

sort_buffer_size = 8M

[myisamchk]

key_buffer = 8M

sort_buffer_size = 8M

[mysqlhotcopy]

interactive-timeout

MySQL 存取權限系統(转帖)

MySQL中文參考手冊-權限(转自:http://sy3es.tnc.edu.tw/teaching/php_mysql/mysql.htm)

1 權限系統做什麼

MySQL權限系統的主要功能是証實連接到一台給定主機的一個用戶,並且賦予該用戶在一個資料庫上select、 insert、update和delete的權限。

附加的功能包括有一個匿名的用戶和對於MySQL特定的功能例如LOAD DATA INFILE進行授權及管理操作的能力。

2 MySQL 用戶名和密碼

由MySQL使用用戶名和密碼的方法與Unix或Windows使用的方式有很多不同之處:

    * MySQL使用於認証目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關。

    * MySQL用戶名最長可以是16各字符﹔典型地,Unix用戶名限制為8個字符。

    * MySQL密碼與Unix密碼沒關系。在你使用登錄到一台Unix機器密碼和你使用在那台機器上存取一個資料庫的密碼之間沒有必要有關聯。

    * MySQL加密密碼使用了一個Unix登錄期間所用的不同算法,使用PASSWORD()和ENCRYPT()函數部分。

3 使你的密碼安全

以一種暴露的可被其他用戶發現的方式指定你的密碼是不妥當的。當你運行客戶程式時,你可以使用下列方法指定你的密碼,還有每個方法的風險評估:

    * 使用一個在命令行上-pyour_pass或--password=your_pass的選項。這很方便但是不安全,因為你的密碼對系統狀態程式(例如ps)變得可見,它可以被其他的用戶調用來顯示命令行。(一般MySQL客戶在他們的初始化順序期間用零覆蓋命令行參數,但是仍然有一個短暫間隔時間內參數值可見的。)

    * 使用一個-p或--password選項(沒有指定your_pass值)。在這種情況下,客戶程式請求來自終端的密碼:

shell>mysql - u  user_name - p

Enter password: ********

      客戶回應“*”字符到作為輸入你的密碼的終端使得旁觀者不能看見它。因為它對其他用戶不可見,與在命令行上指定它相比,這樣進入你的密碼更安全。然而,這個輸入一個密碼的方法僅僅為你交互式運行程式是合適的。如果你想要從非交互式運行的一個腳本調用一個客戶,就沒有從終端輸入入密碼的機會。

4  MySQL提供的權限

權限資訊用user、db、host、tables_priv和columns_priv表被儲存在mysql資料庫中(即在名為mysql的資料庫中)。在MySQL啟動時和在6.9 權限修改何時生效所說的情況時,伺服器讀入這些資料庫表內容。

 

5 權限系統工作原理

MySQL權限系統保証所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL伺服器時, 你的身份由你從那連接的主機和你指定的用戶名來決定,系統根據你的身份和你想做什麼來授予權限。

MySQL在認定身份中考慮你的主機名和用戶名字,是因為有很小的原因假定一個給定的用戶在網際網路上屬於同一個人。例如,用戶從whitehouse.gov連接的bill不必和從mosoft.com連接bill是同一個人。 MySQL通過允許你區分在不同的主機上碰巧有同樣名字用戶來處理它:你可以對從whitehouse.gov連接授與bill一個權限集,而為從microsoft.com的連接授予一個不同的權限集。

MySQL存取控制包含2個階段:

    * 階段1:伺服器檢查你是否允許連接。

    * 階段2:假定你能連接,伺服器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從資料庫中一個表選取(select)行或從資料庫拋棄一個表,伺服器確定你對表有select權限或對資料庫有drop權限。

 

6存取控制, 階段1:連接証實

當你試圖聯接一個MySQL伺服器時,伺服器基於你的身份和你是否能通過供應正確的密碼驗証身份來接受或拒絕連接。如果不是,伺服器完全具結你的存取,否則,伺服器接受連接,然後進入階段2並且等待請求。

你的身份基於2個資訊:

    * 你從那個主機連接

    * 你的MySQL用戶名

身份檢查使用3個user表(Host, User和Password)範圍字段執行。伺服器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的密碼時才接受連接。

在user表範圍字段可以如下被指定:

    * 一個Host值可以是主機名或一個IP數字,或'localhost'指出本地主機。

    * 你可以在Host字段裡使用通配符字符“%”和“_”。

    * 一個Host值'%'匹配任何主機名,一個空白Host值等價於'%'。注意這些值匹配能創建一個連接到你的伺服器的任何主機!

    * 通配符字符在User字段中不允許,但是你能指定空白的值,它匹配任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名,用戶被認為是匿名用戶(沒有名字的用戶),而非客戶實際指定的名字。這意味著一個空白的用戶名被用於在連接期間的進一步的存取檢查(即,在階段2期間)。

    * Password字段可以是空白的。這不意味著匹配任何密碼,它意味著用戶必須不指定一個密碼進行連接。



7 存取控制,階段2:請求証實

一旦你建立了一個連接,伺服器進入階段2。對在此連接上進來的每個請求,伺服器檢查你是否有足夠的權限來執行它,它基於你希望執行的操作類型。這正是在授權表中的權限字段發揮作用的地方。這些權限可以來子user、db、host、tables_priv或columns_priv表的任何一個。授權表用GRANT和REVOKE命令操作。見7.26 GRANT和REVOKE 句法。(你可以發覺參考6.6 權限系統怎樣工作很有幫助,它列出了在每個權限表中呈現的字段。)

user表在一個全局基礎上授予賦予你的權限,該權限不管當前的資料庫是什麼均適用。例如,如果user表授予你delete權限, 你可以刪除在伺服器主機上從任何資料庫刪除行!換句話說,user表權限是超級用戶權限。只把user表的權限授予超級用戶如伺服器或資料庫主管是明智的。對其他用戶,你應該把在user表中的權限設成'N'並且僅在一個特定資料庫的基礎上授權, 使用db和host表。

db和host表授予資料庫特定的權限。在範圍字段的值可以如下被指定:

    * 通配符字符“%”和“_”可被用於兩個表的Host和Db字段。

    * 在db表的'%'Host值意味著“任何主機”,在db表中一個空白Host值意味著“對進一步的資訊咨詢host表”。

    * 在host表的一個'%'或空白Host值意味著“任何主機”。

    * 在兩個表中的一個'%'或空白Db值意味著“任何資料庫”。

    * 在兩個表中的一個空白User值匹配匿名用戶。

db和host表在伺服器啟動時被讀取和排序(同時它讀user表)。db表在Host、Db和User範圍字段上排序,並且host表在Host和Db範圍字段上排序。對於user表,排序首先放置最特定的值然後最後最不特定的值,並且當伺服器尋找匹配入條目時,它使用它找到的第一個匹配。

tables_priv和columns_priv表授予表和列特定的權限。在範圍字段的值可以如下被指定:

    * 通配符“%”和“_”可用在使用在兩個表的Host字段。

    * 在兩個表中的一個'%'或空白Host意味著“任何主機”。

    * 在兩個表中的Db、Table_name和Column_name字段不能包含通配符或空白。

tables_priv和columns_priv表在Host、Db和User字段上被排序。這類似於db表的排序,盡管因為只有Host字段可以包含通配符,但排序更簡單。

 

8 權限更改何時生效

當mysqld啟動時,所有的授權表內容被讀進儲存器並且從那點生效。

用GRANT、REVOKE或SET PASSWORD對授權表施行的修改會立即被伺服器注意到。

如果你手工地修改授權表(使用INSERT、UPDATE等等),你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴伺服器再裝載授權表,否則你的改變將不生效,除非你重啟伺服器。

當伺服器注意到授權表被改變了時,現存的客戶連接有如下影響:

    * 表和列權限在客戶的下一次請求時生效。

    * 資料庫權限改變在下一個USE db_name命令生效。

全局權限的改變和密碼改變在下一次客戶連接時生效。

9 建立初始的MySQL權限

你的安裝初始時廣開大門,你首先應該做的事情之一是為MySQL root用戶指定一個密碼。你可以做如下(注意,你使用PASSWORD()函數指定密碼):

shell> mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('new_password')

           WHERE user='root';

mysql> FLUSH PRIVILEGES;

在MySQL 3.22和以上版本中,你可以使用SET PASSWORD語句:

shell> mysql -u root mysql

mysql> SET PASSWORD FOR root=PASSWORD('new_password');

設置密碼的另一種方法是使用mysqladmin命令:

shell> mysqladmin -u root password new_password

注意:如果你使用第一種方法在user表裡直接更新密碼,你必須告訴伺服器再次讀入授權表(用FLUSH PRIVILEGES),因為否則改變將不被注意到。

一旦root密碼被設置,此後當你作為root與伺服器連接時,你必須供應那個密碼。

 

10 向MySQL增加新用戶權限

你可以有2個不同的方法增加用戶:通過使用GRANT語句或通過直接操作MySQL授權表。比較好的方法是使用GRANT語句,因為他們是更簡明並且好像錯誤少些。

下面的例子顯示出如何使用mysql客戶安裝新用戶。這些例子假定權限根據以前的章節描述的內定被安裝。這意味著為了改變,你必須在mysqld正在運行同一台機器上,你必須作為MySQL root用戶連接,並且root用戶必須對mysql資料庫有insert權限和reload管理權限。另外,如果你改變了root用戶密碼,你必須如下的mysql命令指定它。

你可以通過發出GRANT語句增加新用戶:

shell> mysql --user=root mysql

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost

           IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"

           IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;

mysql> GRANT USAGE ON *.* TO dummy@localhost;

這些GRANT語句安裝3個新用戶:

monty

    可以從任何地方連接伺服器的一個完全的超級用戶,但是必須使用一個密碼('something'做這個。注意,我們必須對monty@localhost和monty@"%"發出GRANT語句。如果我們增加localhost條目,對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮,因為它有更特定的Host字段值,所以以user表排列順序看更早到來。

admin

    可以從localhost沒有一個密碼進行連接並且被授予reload和process管理權限的用戶。這允許用戶執行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,還有mysqladmin processlist。沒有授予資料庫有關的權限。他們能在以後通過發出另一個GRANT語句授權。

dummy

    可以不用一個密碼連接的一個用戶,但是只能從本地主機。全局權限被設置為'N'--USAGE權限類型允許你無需權限就可設置一個用戶。它假定你將在以後授予資料庫相關的權限。

你也可以直接通過發出INSERT語句增加同樣的用戶存取資訊,然後告訴伺服器再次裝入授權表:

shell> mysql --user=root mysql

mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),

                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),

                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

mysql> INSERT INTO user SET Host='localhost',User='admin',

                 Reload_priv='Y', Process_priv='Y';

mysql> INSERT INTO user (Host,User,Password)

                        VALUES('localhost','dummy','');

mysql> FLUSH PRIVILEGES;

取決於你的MySQL版本,對上述,你可能必須使用一個不同數目'Y'值(在3.22.11以前的版本有更少的權限列)。對admin用戶,只用在3.22.11開始的版本具有的更加可讀的INSERT擴充的語法。

注意,為了設置一個超級用戶,你只需創造一個user表條目,其權限字段設為'Y'。不需要db或host表的條目。

在user表中的權限列不是由最後一個INSERT語句明確設置的(對dummy用戶),因此那些列被賦予內定值'N'。這是GRANT USAGE做的同樣的事情。

下列例子增加一個用戶custom,他能從主機localhost、server.domain和whitehouse.gov連接。他只想要從localhost存取bankaccount資料庫,從whitehouse.gov存取expenses資料庫和從所有3台主機存取customer資料庫。他想要從所有3台主機上使用密碼stupid。

為了使用GRANT語句設置個用戶的權限,運行這些命令:

shell> mysql --user=root mysql

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON bankaccount.*

           TO custom@localhost

           IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON expenses.*

           TO custom@whitehouse.gov

           IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

           ON customer.*

           TO custom@'%'

           IDENTIFIED BY 'stupid';

通過直接修改授權表設置用戶權限,運行這些命令(注意,在結束時FLUSH PRIVILEGES):

shell> mysql --user=root mysql

mysql> INSERT INTO user (Host,User,Password)

       VALUES('localhost','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

       VALUES('server.domain','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

       VALUES('whitehouse.gov','custom',PASSWORD('stupid'));

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES

       ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES

       ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db

       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,

        Create_priv,Drop_priv)

       VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES;

頭3個INSERT語句增加user表條目,允許用戶custom用給定密碼從不同的主機進行連接,但是沒有授予任何許可(所有權限被設置為內定值'N')。後3個INSERT語句增加db表條目,授予custom以bankaccount、expenses和customer資料庫權限,但是只能在從正確的主機存取時。通常,在授權表直接被修改時,伺服器必須被告知再次裝入他們(用FLUSH PRIVILEGES)以便使權限修改生效。

如果你想要給特定的用戶從一個給定的域上的任何機器上存取權限,你可以發出一個如下的GRANT語句:

mysql> GRANT ...

           ON *.*

           TO myusername@"%.mydomainname.com"

           IDENTIFIED BY 'mypassword';

為了通過直接修改授權表做同樣的事情,這樣做:

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',

           PASSWORD('mypassword'),...);

mysql> FLUSH PRIVILEGES;

 

11 怎樣設置密碼

在前面小節的例子裡說明了一個重要的原則:當你使用INSERT或UPDATE語句儲存一個非空的密碼時,你必須使用PASSWORD()函數加密它。這是因為在user表刈脛加密形式儲存密碼,而不是作為純文本。如果你忘記這個事實,你可能像這樣試圖設置密碼:

shell> mysql -u root mysql

mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit');

mysql> FLUSH PRIVILEGES

結果是純文本值'biscuit'作為密碼被儲存在user表中。在用戶jeffrey試圖用這個密碼連接伺服器時,mysql客戶用PASSWORD()加密它並且將結果送給伺服器,伺服器比較在user表中的值(它是純文本值'biscuit')和加密的密碼(而不是 'biscuit'),比較失敗並且伺服器拒絕連接:

shell> mysql -u jeffrey -pbiscuit test

Access denied

因為當他們被插入user表時,密碼必須被加密,相反,INSERT語句應該像這樣被指定:

mysql> INSERT INTO user (Host,User,Password)

       VALUES('%','jeffrey',PASSWORD('biscuit'));

當你使用SET PASSWORD語句時,你也必須使用PASSWORD()函數:

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');

如果你使用GRANT ... IDENTIFIED BY語句或mysqladmin password命令設置密碼,PASSWORD()函數是不必要的。他們都考慮到為你加密密碼,多以你可像這樣指定一個密碼'biscuit':

mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';

shell> mysqladmin -u jeffrey password biscuit

注意: PASSWORD()不是以在Unix密碼加密的同樣方法施行密碼加密。你不應該假定如果你的Unix密碼和你的MySQL密碼是一樣的,PASSWORD()將導致與在Unix密碼文件被儲存的同樣的加密值。

mysql4.0.17和mysql4.1.18在学习日记开源项目中使用的问题

  如果用ant初始化mysql4.0.17或mysql4.1.18,则必须用ascii编码(也就是一般的文本文件)写sql语句;如果用source命令导入数据或者用mysql < *.sql 建数据库,则必须用utf-8编码写sql语句。

  在使用mysql4.1.18,数据库前,必须设置:[client][mysqld]下的default_character_set=utf8

  用source命令导入mysql4.0.17的脚本时必须是用utf-8编码写sql语句,倒是mysql4.0.17不必在my.ini或my.cnf下设置默认字符集,就是设置了好像也不起作用?但是又好像有作用(见:我会设置mysql的默认字符集了 http://www.123go.org.cn/disDiaryContentAction.do?searchDiaryID=153&goalID=153&naviStr=a10a241)

  

  所以,我把学习日记初始化数据库的脚本分为了:learndiarydb_mysql4.0.17.sql,learndiarydb_mysql4.0.17_for_ant.sql,learndiarydb_mysql4.1.18.sql ,learndiarydb_mysql4.1.18_for_ant.sql 。

  相应的,初始化数据库的ant脚本也分为了两个target:initdb_mysql4.0.17和initdb_mysql4.1.18,在target:initdb_mysq4.0.17,必须其中指定数据库编码:url="jdbc:mysql://localhost:3306/learndiarydb?useUnicode=true&characterEncoding=UTF-8" ;而在initdb_mysql4.1.18中则不必。

  搞不懂是怎么一回事了?只能知其然而不知其所以然了,哪位过来者提示一下?:)

无法把原来的数据从mysql4.0.*转入mysql4.1.*

  在redhatlinux9.0的mysql4.1.18中,在my.cnf设置了[client][mysqld]下的default_character_set=utf8,用mysqladmin variables 命令查看服务器和客户端的所有字体方面的设置均是utf8了,可是原来的数据在网页显示仍是乱码。

  在页面上写作帖子新加的数据又能正常显示,搞不懂了。

终于搞定了mysql 4.1的中文问题:D(转帖)

转自:http://www.cjsdn.net/post/view?bid=10&id=120763&sty=1&tpg=1&age=0

 

  中国Java开发网 

注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

 

您没有登录 

» 中国Java开发网 » Database/JDBC/JDO » MySQL 

 打印话题     寄给朋友     订阅主题 

 

作者 终于搞定了mysql 4.1的中文问题:D [精华] 

wuliang

 

 

发贴: 46

积分: 20

  于 2004-11-01 11:04 

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

 

4.0之前用缺省字符集latin1,连接加useUnicode=true&characterEncoding=GBK可以了,

后来因为有子查询的需要,升级到4.1,发现这招失灵,经过一天摸索,终于搞定:D

1、mysql字符集要设成utf8,可以在安装时设置,也可以在my.ini里改(需要重新启动mysql)

#必须在[mysqld]这段

[mysqld]

default-character-set=utf8

这就足够,设置后重启server,用mysqladmin variables命令检查

| character_set_client | utf8

| character_set_connection | utf8

| character_set_database | utf8

| character_set_results | utf8

| character_set_server | utf8

| character_set_system | utf8

| collation_connection | utf8_general_ci

| collation_database | utf8_general_ci

| collation_server | utf8_general_ci

2、jdbc连接无需加characterEncoding,会自动检测

jdbc:mysql://localhost/test

实际上server端字符集不是utf8的话,加了也没用(jdbc:mysql://localhost/test&characterEncoding=UTF-8或者GBK)

可能还会报错;是utf8的话,加不加都行

3、mysql client记得加--default-character-set

windows平台:

mysql -u root -p --default-character-set=gbk

linux平台:

mysql -u root -p --default-character-set=utf8

否则进去select中文是乱码,insert中文也不能正确保存,一整天主要是被这个困扰~~

这是我的办法,按理mysql字符集是latin1也可以操作中文(4.0就是这样),不过我没试出来,客户端还是需要额外编码

******

windows xp简体中文

redhat fedora core 2, LANG=zh_CN

mysql-4.1.7

wuliang edited on 2004-11-03 22:11

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

• 一个很好的关于swt布局管理的例子(希望加精)! 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

scud

 

CJSDN高级会员

 

发贴: 107

积分: 10

  于 2004-11-01 11:20 

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

建的表或者database是utf-8也可以,如果服务器不是你控制的话

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

• system.in.read()能够读入INT型的数据吗 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

wuliang

 

 

发贴: 46

积分: 20

  于 2004-11-03 21:45 

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

hehe,竟然加了精:D

wuliang edited on 2004-11-03 22:12

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

• 寻找长期合作伙伴,外包小型专案,适合兼职,每月case稳定名额有限... 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

chaiwei

 

 

发贴: 1

积分: 0

  于 2004-11-05 00:51 

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

无论采用什么字符集,只要将被查询的字段属性加为二进制,即可实现中文查询

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

• 去欧洲玩 只能去一个地区 随便选 去哪儿好呢? 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

wes109

 

龙的传人

CJSDN高级会员

 

发贴: 819

积分: 51

  于 2004-12-13 14:39 

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

 

补充几点:

如果你已经创建了数据库,并且是latin1编码的,还需要修改具体数据库和表的charset

修改数据库的字符集:

ALTER DATABASE `dbname` CHARACTER SET utf8  COLLATE utf8_general_ci;

修改具体表的字符集:

 ALTER TABLE `tablename`CHARACTER SET utf8  COLLATE utf8_general_ci;

在建表时指定字符集:

DROP TABLE IF EXISTS `area`;CREATE TABLE `area` (  `code` varchar(4) NOT NULL default '',  `name` varchar(10) NOT NULL default '',  PRIMARY KEY  (`code`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

千年后如若我再生于祖国的河岸

千年后我再次拥有中国的稻田 和周天子的雪山 天马踢踏

和所有以梦为马的诗人一样

我选择永恒的事业.

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

• 还有半年就没课了,最后一年实习,而我........ 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

lcwling

 

Java咋就这么难呢?!

CJSDN高级会员

 

发贴: 342

积分: 82

  于 2005-01-13 21:13 

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

还是老问题,用utf8不知道客户端用什么工具方便view or edit?中文还是显示不太正常,不方便前端查看?!

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

认真对待每一天吧,因为生活每天都是新的!

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

• Java的JFrame怎么设置最大化! 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

kirk

 

 

发贴: 55

积分: 0

  于 2005-03-28 17:39 

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

我试过楼主的方法,只有character_set_system的值为utf8,其他没有任何变化,why?

对了,我的mysql4。1非安装版的,是直接更新4.0的系统(除data目录)。

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

• 请各位帮忙看看哪里出错了(Cannot invoke length() on the array type char[]) 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

chengbd

 

版主

 

发贴: 621

积分: 112

  于 2005-04-18 06:18 

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

经过几天的翻阅文档和实验,终于找到了比较好的解决办法。

可以不需要修改my.ini。

在建立数据库的时候,对库和表的字符集设置不太重要,但是对文本类型的字段最好都设置为GBK字符集。

对于已有的数据库可以用以下方法转换字段编码:

ALTER TABLE t MODIFY hoverfly BINARY(100);

ALTER TABLE t MODIFY hoverfly CHAR(100) CHARACTER SET gbk;

注意用此方法如果不修改程序,会发现查询出的结果都是乱码,可以通过在my.ini的[mysqld]段内加default-character-set=gbk来纠正。但是这样你会发现那些没有转换编码的文本字段里的中文都是乱码。

其实有更简单的办法,在进行查询前,只要执行SET character_set_results = NULL就可以。而且这是不管是转换了的还是没转换的字段都不会出现乱码。而转换了的字段可以正常的对中文进行排序。

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

• 去欧洲玩 只能去一个地区 随便选 去哪儿好呢? 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

chengbd

 

版主

 

发贴: 621

积分: 112

  于 2005-04-18 06:19 

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

 

SET character_set_results = GB2312

在my.ini里

加入

default-character-set=gb2312

当然位置要放对了才可以

create database ......set charset=UTF-8

困扰了1天,昨天看了台湾的一个哥们写的说明才基本搞定。

在my.ini中的两处加入,分别是[mysqld]和[*client]处

default-character-set=gb2312 ,reboot机器(重要)。

在网页中就可以访问了,注意使用可视工具的来维护mysql的,

可能由于不支持中文的编码,插入中文数据后,仍然是乱码。

使用命令行的应该可以了。 另外gb2312也可以改成其他的编码方式,只要和jsp页上的统一即可。

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

• 一个Java问题请教~(输入一个变量 叫 “11th of January 2002”) 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

benjaminliang

 

 

发贴: 9

积分: 0

  于 2005-04-27 11:23 

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

mysql> status

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

D:\Program Files\MySQL\MySQL Server 4.1\bin\mysql.exe Ver 14.7 Distrib 4.1.11,

for Win32 (ia32)

Connection id: 1

Current database: qtedu

Current user: root@localhost

SSL: Not in use

Using delimiter: ;

Server version: 4.1.11-nt

Protocol version: 10

Connection: localhost via TCP/IP

Insert id: 98

Server characterset: gbk

Db characterset: latin1

Client characterset: gbk

Conn. characterset: gbk

TCP port: 3306

Uptime: 18 min 49 sec

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

mysql> show variables like 'character%';

+--------------------------+------------------------

-----+

| Variable_name | Value

|

+--------------------------+------------------------

-----+

| character_set_client | gbk

|

| character_set_connection | gbk

|

| character_set_database | latin1

|

| character_set_results | gbk

|

| character_set_server | gbk

|

| character_set_system | utf8

|

表的字符集设置还真不起作用 !

修改了字段的编码方式为gbk后,插入的数据显示都正常在Query Broswer中显示也正常,

不设置建立数据库的字符集

String DBConnStr="jdbc:mysql://localhost:3306/qtedu?user=root&password=benjamin";

在jsp+bean的应用中插入和查询都正常。(用驱动mysql-connector-java-3.1.8-bin.jar)

新建立的数据库会按设置的默认的gbk编码,这时候字段也是默认的gbk了

昨天搞了一天 谢谢楼上各位!!

benjaminliang edited on 2005-04-27 11:39

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

• 还有半年就没课了,最后一年实习,而我........ 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

dazern

 

 

发贴: 11

积分: 3

  于 2005-05-13 01:44 

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

还是不明白!

问题依旧!

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

• "~"非运算的值怎么往后跑了一位? 

作者 Re:终于搞定了mysql 4.1的中文问题:D [Re:wuliang] 

aiff

 

 

发贴: 85

积分: 10

  于 2005-06-13 16:31 

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

mysql> SHOW VARIABLES LIKE 'character_set_%';+--------------------------+---------------------------------------------------------+| Variable_name            | Value     |+--------------------------+---------------------------------------------------------+| character_set_client     | latin1     || character_set_connection | latin1     || character_set_database   | gbk     || character_set_results    | latin1     || character_set_server     | gbk     || character_set_system     | utf8     || character_sets_dir       | C:\Program Files\MySQL\MySQL Server 4.1\share\charsets/ |+--------------------------+---------------------------------------------------------+7 rows in set (0.00 sec)

我现在变成这样了 怎么理解

是我以前的表的问题 还是现在的问题没有解决?

aiff edited on 2005-06-13 16:34

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

• 请各位帮忙看看哪里出错了(Cannot invoke length() on the array type char[]) 

 

  已读帖子

  新的帖子

  被删除的帖子

 

返回中国Java开发网论坛

Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent

Copyright © 2002-2006 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号

客服电话 13606058863    客服信箱 support@cjsdn.net    客服QQ 714913

mysql数据库优化 及MySQL服务维护笔记 (Linux下)(转帖2

(转自:http://spaces.msn.com/lzhuacuo/PersonalSpace.aspx?_c11_blogpart_blogpart=blogview&_c=blogpart&partqs=cat%3dOpen%2bSource)

mysql数据库优化

 

添加:2005-9-4 6:43:26 来源: 作者:

 

 

首先,为了使一个系统更快,最重要的部分就是基础设计,不过有些东西是现有情况下无法逾越的,比如说系统常见的瓶颈.

我所能想到的:

1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化的方法是----用多个硬盘,或者把数据分散存储.

2:硬盘的读写速度,这个速度非常的快(限于本人的知识所限,只知道在每秒几十甚至上百MB).这个更容易解决--可以从多个硬盘上并行读写.

3:cpu.cpu处理内存中的数据,当有相对内存较小的表时,这是最常见的限制因素.

4:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈---不过现在内存大的惊人,一般不会出现这个问题.

第二步:

(本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))

1:调节服务器参数

用shell>mysqld-help这个命令声厂一张所有mysql选项和可配置变量的表.输出以下信息:

possible variables for option--set-variable(-o) are:

back_log current value:5 //要求mysql能有的连接数量.back_log指出在mysql暂停接受连接的时间内有多少个连接请求可以被存在堆栈中

connect_timeout current value:5 //mysql服务器在用bad handshake(不好翻译)应答前等待一个连接的时间

delayed_insert_timeout current value:200 //一个insert delayed在终止前等待insert的时间

delayed_insert_limit current value:50 //insert delayed处理器将检查是否有任何select语句未执行,如果有,继续前执行这些语句

delayed_queue_size current value:1000 //为insert delayed分配多大的队

flush_time current value:0 //如果被设置为非0,那么每个flush_time 时间,所有表都被关闭

interactive_timeout current value:28800 //服务器在关上它之前在洋交互连接上等待的时间

join_buffer_size current value:131072 //用与全部连接的缓冲区大小

key_buffer_size current value:1048540 //用语索引块的缓冲区的大小,增加它可以更好的处理索引

lower_case_table_names current value:0 //

long_query_time current value:10 //如果一个查询所用时间大于此时间,slow_queried计数将增加

max_allowed_packet current value:1048576 //一个包的大小

max_connections current value:300 //允许同时连接的数量

max_connect_errors current value:10 //如果有多于该数量的中断连接,将阻止进一步的连接,可以用flush hosts来解决

max_delayed_threads current value:15 //可以启动的处理insert delayed的数量

max_heap_table_size current value:16777216 //

max_join_size current value:4294967295 //允许读取的连接的数量

max_sort_length current value:1024 //在排序blob或者text时使用的字节数量

max_tmp_tables current value:32 //一个连接同时打开的临时表的数量

max_write_lock_count current value:4294967295 //指定一个值(通常很小)来启动mysqld,使得在一定数量的write锁定之后出现read锁定

net_buffer_length current value:16384 //通信缓冲区的大小--在查询时被重置为该大小

query_buffer_size current value:0 //查询时缓冲区大小

record_buffer current value:131072 //每个顺序扫描的连接为其扫描的每张表分配的缓冲区的大小

sort_buffer current value:2097116 //每个进行排序的连接分配的缓冲区的大小

table_cache current value:64 //为所有连接打开的表的数量

thread_concurrency current value:10 //

tmp_table_size current value:1048576 //临时表的大小

thread_stack current value:131072 //每个线程的大小

wait_timeout current value:28800 //服务器在关闭它3之前的一个连接上等待的时间

根据自己的需要配置以上信息会对你帮助.

 

 

 

 

添加评论 | 阅读评论 (1)

9:46  |  固定链接 | 引用通告 (0) | 记录它 | Open Source

 

 

固定链接  关闭

 

http://spaces.msn.com/lzhuacuo/blog/cns!18730E989D068035!473.entry

 

 

 

 

 

 

 

MySQL服务维护笔记

 

MySQL服务维护笔记

作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com

写于:2002/07 最后更新: 03/16/2005 16:28:35

Feed Back >> (Read this before you ask question)

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

http://www.chedong.com/tech/mysql.html

内容摘要:使用MySQL服务的一些经验,主要从以下几个方面考虑的MySQL服务规划设计。对于高负载站点来说PHP和MySQL运行在一起(或者说任何应用和数据库运行在一起的规划)都是性能最大的瓶颈,这样的设计有如让人一手画圆一手画方,这样2个人的工作效率肯定不如让一个人专门画圆一个人专门画方效率高,让应用和数据库都跑在一台高性能服务器上说不定还不如跑在2台普通服务器上快。

以下就是针对MySQL作为专门的数据库服务器的优化建议:

MySQL服务的安装/配置的通用性;

系统的升级和数据迁移方便性;

备份和系统快速恢复;

数据库应用的设计要点;

一次应用优化实战;

MySQL服务器的规划

=================

为了以后维护,升级备份的方便和数据的安全性,最好将MySQL程序文件和数据分别安装在“不同的硬件”上。

         /   /         |    /usr                     <== 操作系统                 |    /home/mysql              <== mysql主目录,为了方便升级,这只是一个最新版本目录的链接 硬盘1==>|    /home/mysql-3.23.54/     <== 最新版本的mysql /home/mysql链接到这里         \   /home/mysql-old/         <== 以前运行的旧版本的mysql         /   /data/app_1/             <== 应用数据和启动脚本等硬盘2==>|    /data/app_2/         \   /data/app_3/

MySQL服务的安装和服务的启动:

MySQL一般使用当前STABLE的版本:

尽量不使用--with-charset=选项,我感觉with-charset只在按字母排序的时候才有用,这些选项会对数据的迁移带来很多麻烦。

尽量不使用innodb,innodb主要用于需要外键,事务等企业级支持,代价是速度比MYISAM有数量级的下降。

./configure --prefix=/home/mysql --without-innodb

make

make install

服务的启动和停止

================

1 复制缺省的mysql/var/mysql到 /data/app_1/目录下,

2 MySQLD的启动脚本:start_mysql.sh

#!/bin/sh

rundir=`dirname "$0"`

echo "$rundir"

/home/mysql/bin/safe_mysqld --user=mysql --pid-file="$rundir"/mysql.pid --datadir="$rundir"/var "$@"\

-O max_connections=500 -O wait_timeout=600 -O key_buffer=32M --port=3402 --socket="$rundir"/mysql.sock &

注释:

--pid-file="$rundir"/mysql.pid --socket="$rundir"/mysql.sock --datadir="$rundir"/var

目的都是将相应数据和应用临时文件放在一起;

-O 后面一般是服务器启动全局变量优化参数,有时候需要根据具体应用调整;

--port: 不同的应用使用PORT参数分布到不同的服务上去,一个服务可以提供的连接数一般是MySQL服务的主要瓶颈;

修改不同的服务到不同的端口后,在rc.local文件中加入:

/data/app_1/start_mysql.sh

/data/app_2/start_mysql.sh

/data/app_3/start_mysql.sh

注意:必须写全路径

3 MySQLD的停止脚本:stop_mysql.sh

#!/bin/sh

rundir=`dirname "$0"`

echo "$rundir"

/home/mysql/bin/mysqladmin -u mysql -S"$rundir"/mysql.sock shutdown

使用这个脚本的好处在于:

1 多个服务启动:对于不同服务只需要修改脚本中的--port[=端口号]参数。单个目录下的数据和服务脚本都是可以独立打包的。

2 所有服务相应文件都位于/data/app_1/目录下:比如:mysql.pid mysql.sock,当一台服务器上启动多个服务时,多个服务不会互相影响。但都放到缺省的/tmp/下则有可能被其他应用误删。

3 当硬盘1出问题以后,直接将硬盘2放到一台装好MySQL的服务器上就可以立刻恢复服务(如果放到my.cnf里则还需要备份相应的配置文件)。

服务启动后/data/app_1/下相应的文件和目录分布如下:

/data/app_1/

    start_mysql.sh 服务启动脚本

    stop_mysql.sh 服务停止脚本

    mysql.pid 服务的进程ID

    mysql.sock 服务的SOCK

    var/ 数据区

       mysql/ 用户库

       app_1_db_1/ 应用库

       app_1_db_2/

...

/data/app_2/

...

查看所有的应用进程ID:

cat /data/*/mysql.pid

查看所有数据库的错误日志:

cat /data/*/var/*.err

个人建议:MySQL的主要瓶颈在PORT的连接数上,因此,将表结构优化好以后,相应单个MySQL服务的CPU占用仍然在10%以上,就要考虑将服务拆分到多个PORT上运行了。

服务的备份

==========

尽量使用MySQL DUMP而不是直接备份数据文件,以下是一个按weekday将数据轮循备份的脚本:备份的间隔和周期可以根据备份的需求确定

/home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f>/path/to/backup/db_name.`data +%w`.dump.gz

因此写在CRONTAB中一般是:

15 4 * * * /home/mysql/bin/mysqldump -S/data/app_1/mysql.sock -umysql db_name | gzip -f>/path/to/backup/db_name.`data +\%w`.dump.gz

注意:

1 在crontab中'%'需要转义成'\%'

2 根据日志统计,应用负载最低的时候一般是在早上4-6点

先备份在本地然后传到远程的备份服务器上,或者直接建立一个数据库备份帐号,直接在远程的服务器上备份,远程备份只需要将以上脚本中的-S /path/to/msyql.sock改成-h IP.ADDRESS即可。

数据的恢复和系统的升级

======================

日常维护和数据迁移:在数据盘没有被破坏的情况下

硬盘一般是系统中寿命最低的硬件。而系统(包括操作系统和MySQL应用)的升级和硬件升级,都会遇到数据迁移的问题。

只要数据不变,先装好服务器,然后直接将数据盘(硬盘2)安装上,只需要将启动脚本重新加入到rc.local文件中,系统就算是很好的恢复了。

灾难恢复:数据库数据本身被破坏的情况下

确定破坏的时间点,然后从备份数据中恢复。

应用的设计要点

==============

如果MySQL应用占用的CPU超过10%就应该考虑优化了。

如果这个服务可以被其他非数据库应用代替(比如很多基于数据库的计数器完全可以用WEB日志统计代替)最好将其禁用:

非用数据库不可吗?虽然数据库的确可以简化很多应用的结构设计,但本身也是一个系统资源消耗比较大的应用。在某些情况下文本,DBM比数据库是更好的选择,比如:很多应用如果没有很高的实时统计需求的话,完全可以先记录到文件日志中,定期的导入到数据库中做后续统计分析。如果还是需要记录简单的2维键-值对应结构的话可以使用类似于DBM的HEAP类型表。因为HEAP表全部在内存中存取,效率非常高,但服务器突然断电时有可能出现数据丢失,所以非常适合存储在线用户信息,日志等临时数据。即使需要使用数据库的,应用如果没有太复杂的数据完整性需求的化,完全可以不使用那些支持外键的商业数据库,比如MySQL。只有非常需要完整的商业逻辑和事务完整性的时候才需要Oracle这样的大型数据库。对于高负载应用来说完全可以把日志文件,DBM,MySQL等轻量级方式做前端数据采集格式,然后用Oracle MSSQL DB2 Sybase等做数据库仓库以完成复杂的数据库挖掘分析工作。

有朋友和我说用标准的MyISAM表代替了InnoDB表以后,数据库性能提高了20倍。

数据库服务的主要瓶颈:单个服务的连接数

对于一个应用来说,如果数据库表结构的设计能够按照数据库原理的范式来设计的话,并且已经使用了最新版本的MySQL,并且按照比较优化的方式运行了,那么最后的主要瓶颈一般在于单个服务的连接数,即使一个数据库可以支持并发500个连接,最好也不要把应用用到这个地步,因为并发连接数过多数据库服务本身用于调度的线程的开销也会非常大了。所以如果应用允许的话:让一台机器多跑几个MySQL服务分担。将服务均衡的规划到多个MySQL服务端口上:比如app_1 ==> 3301 app_2 ==> 3302...app_9 ==> 3309。一个1G内存的机器跑上10个MySQL是很正常的。让10个MySQLD承担1000个并发连接效率要比让2个MySQLD承担1000个效率高的多。当然,这样也会带来一些应用编程上的复杂度;

使用单独的数据库服务器(不要让数据库和前台WEB服务抢内存),MySQL拥有更多的内存就可能能有效的进行结果集的缓存;在前面的启动脚本中有一个-O key_buffer=32M参数就是用于将缺省的8M索引缓存增加到32M(当然对于)

应用尽量使用PCONNECT和polling机制,用于节省MySQL服务建立连接的开销,但也会造成MySQL并发链接数过多(每个HTTPD都会对应一个MySQL线程);

表的横向拆分:让最常被访问的10%的数据放在一个小表里,90%的历史数据放在一个归档表里(所谓:快慢表),数据中间通过定期“搬家”和定期删除无效数据来节省,毕竟大部分应用(比如论坛)访问2个月前数据的几率会非常少,而且价值也不是很高。这样对于应用来说总是在一个比较小的结果级中进行数据选择,比较有利于数据的缓存,不要指望MySQL中对单表记录条数在10万级以上还有比较高的效率。而且有时候数据没有必要做那么精确,比如一个快表中查到了某个人发表的文章有60条结果,快表和慢表的比例是1:20,那么就可以简单的估计这个人一共发表了1200篇。Google的搜索结果数也是一样:对于很多上十万的结果数,后面很多的数字都是通过一定的算法估计出来的。

数据库字段设计:表的纵向拆分(过渡范化):将所有的定长字段(char, int等)放在一个表里,所有的变长字段(varchar,text,blob等)放在另外一个表里,2个表之间通过主键关联,这样,定长字段表可以得到很大的优化(这样可以使用HEAP表类型,数据完全在内存中存取),这里也说明另外一个原则,对于我们来说,尽量使用定长字段可以通过空间的损失换取访问效率的提高。在MySQL4中也出现了支持外键和事务的InnoDB类型表,标准的MyISAM格式表和基于HASH结构的HEAP内存表,MySQL之所以支持多种表类型,实际上是针对不同应用提供了不同的优化方式;

仔细的检查应用的索引设计:可以在服务启动参数中加入 --log-slow-queries[=file]用于跟踪分析应用瓶颈,对于跟踪服务瓶颈最简单的方法就是用MySQL的status查看MySQL服务的运行统计和show processlist来查看当前服务中正在运行的SQL,如果某个SQL经常出现在PROCESS LIST中,一。有可能被查询的此时非常多,二,里面有影响查询的字段没有索引,三,返回的结果数过多数据库正在排序(SORTING);所以做一个脚本:比如每2秒运行以下show processlist;把结果输出到文件中,看到底是什么查询在吃CPU。

全文检索:如果相应字段没有做全文索引的话,全文检索将是一个非常消耗CPU的功能,因为全文检索是用不上一般数据库的索引的,所以要进行相应字段记录遍历。关于全文索引可以参考一下基于Java的全文索引引擎lucene的介绍。

前台应用的记录缓存:比如一个经常使用数据库认证,如果需要有更新用户最后登陆时间的操作,最好记录更新后就把用户放到一个缓存中(设置2个小时后过期),这样如果用户在2个小时内再次使用到登陆,就直接从缓存里认证,避免了过于频繁的数据库操作。

查询优先的表应该尽可能为where和order by字句中的字段加上索引,数据库更新插入优先的应用索引越少越好。

总之:对于任何数据库单表记录超过100万条优化都是比较困难的,关键是要把应用能够转化成数据库比较擅长的数据上限内。也就是把复杂需求简化成比较成熟的解决方案内。

一次优化实战

============

以下例子是对一个论坛应用进行的优化:

用Webalizer代替了原来的通过数据库的统计。

首先通过TOP命令查看MySQL服务的CPU占用左右80%和内存占用:10M,说明数据库的索引缓存已经用完了,修改启动参数,增加了-O key_buffer=32M,过一段时间等数据库稳定后看的内存占用是否达到上限。最后将缓存一直增加到64M,数据库缓存才基本能充分使用。对于一个数据库应用来说,把内存给数据库比给WEB服务实用的多,因为MySQL查询速度的提高能加快web应用从而节省并发的WEB服务所占用的内存资源。

用show processlist;统计经常出现的SQL:

每分钟运行一次show processlist并记录日志:

* * * * * (/home/mysql/bin/mysql -uuser -ppassword < /home/chedong/show_processlist.sql >>  /home/chedong/mysql_processlist.log)

show_processlist.sql里就一句:

show processlist;

比如可以从日志中将包含where的字句过滤出来:

grep where mysql_processlist.log

如果发现有死锁,一定要重新审视一下数据库设计了,对于一般情况:查询速度很慢,就将SQL where字句中没有索引的字段加上索引,如果是排序慢就将order by字句中没有索引的字段加上。对于有%like%的查询,考虑以后禁用和使用全文索引加速。

还是根据show processlist;看经常有那些数据库被频繁使用,考虑将数据库拆分到其他服务端口上。

MSSQL到MySQL的数据迁移:ACCESS+MySQL ODBC Driver

在以前的几次数据迁移实践过程中,我发现最简便的数据迁移过程并不是通过专业的数据库迁移工具,也不是MSSQL自身的DTS进行数据迁移(迁移过程中间会有很多表出错误警告),但通过将MSSQL数据库通过ACCESS获取外部数据导入到数据库中,然后用ACCESS的表==>右键==>导出,制定ODBC,通过MySQL的DSN将数据导出。这样迁移大部分数据都会非常顺利,如果导出的表有索引问题,还会出添加索引提示(DTS就不行),然后剩余的工作就是在MySQL中设计字段对应的SQL脚本了。

参考文档:

MySQL的参考:

http://www.mysql.com/documentation/mysql/bychapter/

原文出处:<a href="http://www.chedong.com/tech/mysql.html">http://www.chedong.com/tech/mysql.html</a>

<<返回

 

java.net.BindException: Address already in use: connect

节摘自:http://blogger.org.cn/blog/more.asp?name=sixsun&id=10349

关于【NESTED BEGIN EXCEPTION】http://forums.mysql.com/read.php?39,34091,34091#msg-34091

java.net.SocketException

MESSAGE: java.net.BindException: Address already in use: connect

 

 

MySQL Connectors » JDBC » NESTED BEGIN EXCEPTIOn

NESTED BEGIN EXCEPTIOn

Posted by: Rakesh BK (IP Logged)

Date: July 13, 2005 02:24AM

While connecting to Mysql DB from JBOSS server i am getting the following exception..

Please suggest some solution .

Details of the exception

** BEGIN NESTED EXCEPTION **

java.net.SocketException

MESSAGE: java.net.BindException: Address already in use: connect

STACKTRACE:

java.net.SocketException: java.net.BindException: Address already in use: connect

at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:151)

at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:281)

at com.mysql.jdbc.Connection.createNewIO(Connection.java:1696)

at com.mysql.jdbc.Connection.<init>(Connection.java:408)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:270)

at java.sql.DriverManager.getConnection(DriverManager.java:512)

** END NESTED EXCEPTION **

11:22:10,628 ERROR [STDERR] at com.mysql.jdbc.Connection.createNewIO(Connection.java:1

759)

11:22:10,628 ERROR [STDERR] at com.mysql.jdbc.Connection.<init>(Connection.java:408)

11:22:10,628 ERROR [STDERR] at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegister

ingDriver.java:270)

Thanks

Rakesh.B.K

 

     Re: NESTED BEGIN EXCEPTIOn

Rakesh,

You're creating more TCP/IP connections than your OS is configured to handle. Are you using a connection pool? Is there some other process which creates many TCP/IP connections on your system?

-Mark

--

Mark Matthews

MySQL AB, Software Development Manager - Client Connectivity

www.mysql.com

 

David,

You're creating connections faster than your OS can recycle sockets out of TIME_WAIT status. That is why you get the exception you posted.

Connections should be relatively long-lived objects, maybe you should investigate re-using them within your application or via a connection pool?

-Mark

--

Mark Matthews

MySQL AB, Software Development Manager - Client Connectivity

www.mysql.com

 

Yes Mark, you are right!!! In addition I would like to warn developers using Win XP with SP 2 that SP 2 introduces a new TCP/IP feature: the number of possible TCP connection attempts is limited to 10 per second. I think that’s why getting an exception related with TCP connections it’s so easy.

Thanks for your help and time,

Best regards,

David Benaderet.

使用mysql5.0.18数据库

  原来的图形工具sqlyogV3.5连不上它了,估计是驱动版本低了。另外,在java程序中原来用的mysqldriver.jar用不成了,去mysql网站下了一个mysql-connector-java-3.0.17-ga-bin.jar解决问题。

  我是为测试在http://www.learndiary.com/disDiaryContentAction.do?goalID=1468中的java.sql.SQLException问题装它的。但是这个问题不是数据库的问题。是连接池属性文件的配置不适合mysql语法的原因。

(转帖)MYSQL 修改root密码命令

转自:http://it.dg.gd.cn/print.php/770

                  正文

××××××××××××××××××××××××××××××××××××××××××××××××××××

MYSQL 修改root密码命令

2005-10-14       

打印自: IT学院,linux应用,linux技巧,web技术,windows相关,数据库,网管技术,网页技术,unix,轻松一刻,精品网文,精品图片,博客文章

地址: http://it.dg.gd.cn/article.php/770

MYSQL 修改root密码命令

cmd下切换到 mysql 安装目录



d:/mysql/bin

前提:mysql用户root密码为空.

输入 mysql -u root mysql

mysql> 状态下输入 update user set password=password('新密码') where user='root';

回显

Query OK, 0 rows affected (0.00 sec)

Rows matched: 2 Changed: 0 Warnings: 0

mysql> 状态下输入 FLUSH PRIVILEGES;

回显

Query OK, 0 rows affected (0.00 sec)

mysql> 状态下输入 quit

退出 sql

注意每个命令后都要加上一个分号 ";"

mysql 才开始执行该行命令

而第二个指令会让已载入记忆体的 mysql 系统资料库更新

重起 mysql .

在更新 root 密码後,日後要与 MySQL 连线的方法为:

mysql -uroot -p新密码

 

 

责任编辑: yufish