安装PostgreSQL。

    现在最新版本的 Postgres 8.1 已经发行了 for windows 版本的发行包,

可以在官方网站得到 “http://www.postgresql.org/”。

   由于它最早出现在 *nix 系统上,

而且它的文档也多是使用 *nix 上的概念,

所以,这里介绍一下此软件在 Linux 下的安装。

(只要有在windows下安装软件经验的朋友,都可以在windows下顺利安装它)

  由于我使用的Linux是SlackWare,所以,有一些词语会涉及到SlackWare,不过,

对于其他发行版本的Linux也适用。

  1、在 http://www.postgresql.org/ftp/source/v8.1.3/ 这里下载 postgresql-8.1.3.tar.bz2 这个文件,

这就是我们要安装的发行包。

  2、顺序执行下面的命令,每个命令是一行:

<1>tar jxvf postgresql-8.1.3.tar.bz2 //解开发行包

<2>cd postgresql-8.1.3 //进入软件目录

<3>./configure --prefix=PREFIX //PREFIX是自己想安装到哪里的路径,比如/usr/local/postgres

<4>make //使用GNU make工具编译源代码

<5>make install //最后安装软件。

  3、起动Postgres不能使用root用户(Postgres不建议这样作),所以,接下来创建一个专门管理Postgres的用

户:

useradd -m postgres //追加一个叫postgres的用户, -m是为这个用户自动建立一个home目录。

passwd postgres //为这个用户修改密码,刚才添加用户时没有指定密码,所以现在只需输入新密码并确认密

码即可。其实,在useradd的时候也可以顺便设置密码的,感兴趣的话,自己研究一下吧!

  4、为了postgres用户可以正常使用postgres软件,下面将安装postgres软件的目录的拥有者改成postgres用

户:

比如安装在了/usr/local/postgres 这里,那么,以root身份执行

" chown postgres -R /usr/local/postgres "。

chown用于改变一个路径的拥有者, -R 用于将拥有者置于指定路径及其子目录。

  5、创建数据库集群:

<1>由于要管理postgres软件,所以,首先将用户改成postgres。执行命令 " su postgres ",如果是非root用

户执行这个命令,还要输入postgres用户的密码才行。

<2>进入postgres安装目录的bin文件夹。

<3>执行 " ./initdb -D /usr/local/pgsql/data "

  6、所有东西都准备好了,就该起动服务器了。

<1>执行“ ./pg_ctl start -l logfile ”。

<2>然后可以运行“ ./psql ” 来使用PostgreSQL软件了。

  7、每次都到$POSTGRES_HOME/bin中,执行“点”命令显得有点傻,所以,还是将Postgres的安装目录

加入到PATH环境变量中,使得每次启动机器,都可以使用其bin目录中的命令进行管理:

这里介绍一个简单的方法,编辑 "/etc/profile" 文件,在"export PATH"句(可能还包括其他环境变量)前面

加上一句:"PATH=$PATH:/usr/local/postgres/bin"(不含双引号,冒号后面适Postgres安装目录的bin目录)即

可。

  8、通常,需要在Slackware 起动的时候,自动起动PostgreSQL服务器,需要修改文件 /etc/rc.d/rc.local

,加入下面代码:

su - postgres -c 'postgres安装目录/bin/pg_ctl -D postgres安装目录/data -l ~/postgersql.log start'

例如:安装在 /usr/local/postgres 目录,就可以写成:

su - postgres -c '/usr/local/postgres/bin/pg_ctl -D /usr/local/postgres/data -l ~/postgersql.log

start'

由于SlackWare是BSD风格的linux,所以我采用了这种简单的方式,

如果您的linux属于SysV风格,也可以将启动脚本放到 /etc/rc.d/rc.3和/etc/rc.d/rc.5 目录下,

并作相应的设置。

不过,无论是BSD风格还是SysV风格的Linux,都可以使用我在(8)中介绍的方式实现开机启动Postgres的目的。

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

 

mysql从4.11开始支持子查询(转帖)

  我用的mysql4.0.14,试验可以在插入语句中使用子查询,如:

insert into learndiary_login.user

  (SELECT userID,userName,psd,email

  FROM websitedb.user

  where userid<30)

  但是其它的子查询不行:

select * from

  (select userID*2 AS u1,userName as u2,

    psd as u3,email as u4) as t

where u1>50 

下面的文章说mysql从4.11开始支持子查询,正文如下:

关于MySQL嵌套查询的技巧   [ 2005-10-11 14:57:12 | 5iuu ]

许多人都觉得MySQL不支持嵌套查询,其实MySQl从4.11版后已经完全支持嵌套查询了,那么下面我举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual):

1. SELECT语句的子查询:

语法: SELECT ... FROM (subquery) AS name ...

先创建一个表:

CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);

INSERT INTO t1 VALUES (1,'1',1.0);

INSERT INTO t1 VALUES (2,'2',2.0);

我们就可以进行以下的嵌套查询了:

SELECT sb1,sb2,sb3

FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb

WHERE sb1 > 1;

结果是: 2, '2', 4.0.

我们知道下面语句是不会得到正确结果的,因为对经过Group by排序的集合进行求均值是不能得到正确答案的:

SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1

所以我们可以通过下面的嵌套查询实现同样的效果:

SELECT AVG(sum_column1)

FROM (SELECT SUM(column1) AS sum_column1

FROM t1 GROUP BY column1) AS t1;

2.行的子查询(Row Subquery):

看下面的例子:

SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);

这个查询是返回column1等于column2的结果行。Row函数中的1和2相当于构造参数。想必Blogjava上的同志对这些应该比较清楚,也不去详细介绍了。

3.使用Exist和Not Exist参数

这里的Exist和Not Exist用途及用法和在其他没有什么大的区别,我就简单举几个范例好了:

范例一: SELECT DISTINCT store_type FROM Stores

WHERE EXISTS (SELECT * FROM Cities_Stores

WHERE Cities_Stores.store_type = Stores.store_type);

范例二: SELECT DISTINCT store_type FROM Stores

WHERE NOT EXISTS (SELECT * FROM Cities_Stores

WHERE Cities_Stores.store_type = Stores.store_type);

范例三: 这个例子中嵌套使用了Not Exist语法,稍微注意一下:

SELECT DISTINCT store_type FROM Stores S1

WHERE NOT EXISTS (

SELECT * FROM Cities WHERE NOT EXISTS (

SELECT * FROM Cities_Stores

WHERE Cities_Stores.city = Cities.city

AND Cities_Stores.store_type = Stores.store_type));

4.条件关联关系查询:

解释起来麻烦,直接看例子吧:

SELECT column1 FROM t1 AS x

WHERE x.column1 = (SELECT column1 FROM t2 AS x

WHERE x.column1 = (SELECT column1 FROM t3

WHERE x.column2 = t3.column1));

跟其他数据库做法是一样的。

5.其他使用方法和注意:

除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。

SELECT (SELECT s1 FROM t2) FROM t1;

SELECT (SELECT s2 FROM t1);

支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。

子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用<,>, <=, >=, =, <>运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。

Tags:MySQL相关日志: JSP连接mysql数据库攻略    [2005-10-21 PM | 日积月累]

 

引用通告地址 (0):[本站声明:此文章来源于网络,如果未属名,可能此文被转摘多次,原作者不详,如果您认为侵权,请联系我。我将在第一时间按要求做出处理,并消除影响。][字体大小:大 中 小] [ 收藏此页到 365KEY | 博采 | 人人网摘 ]

http://www.GuoBlog.com/trackback.asp?tbID=694

http://www.GuoBlog.com/trackback.asp?tbID=694&CP=GBK

mysql数据库的导出和导入

  用图形工具是比较方便的,比如我用的:SQLyog。

  在命令行中的方式为:

  1、把整个数据库导出为一个sql文件:用:mysqldump dbname > c:\mydb.sql

  2、把sql文件导入数据库:用mysql命令进入mysql,在mysql>提示符下输入:

  1)创建数据库:create database newdb;

  2)使用当前数据库:use newdb;

  3)导入sql文件中的数据:source c:\mydb.sql(无分号)

  这样,就把mydb.sql中的数据导入到新的数据库newdb了。