怎样给访问量过大的mysql数据库减压

怎样给访问量过大的mysql数据库减压,第1张

单机MySQL数据库的优化

一、服务器硬件对MySQL性能的影响

 

 ①磁盘寻道能力(磁盘I/O),我们现在上的都是SAS15000转的硬盘。MySQL每秒钟都在进行大量、复杂的查询 *** 作,对磁盘的读写量可想而知。

所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访

问量在100万PV以上的Discuz!论坛,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案:

使用RAID1+0磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快。

②CPU 对于MySQL应用,推荐使用DELL R710,E5620 @2.40GHz(4 core)* 2 ,我现在比较喜欢DELL R710,也在用其作Linuxakg 虚拟化应用;

③物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存,不过内存对于现在的服务器而言可以说是一个可以忽略的问题,工作中遇到高端服务器基本上内存都超过了32G。

我们工作中用得比较多的数据库服务器是HP DL580G5和DELL R710,稳定性和性能都不错;特别是DELL R710,我发现许多同行都是采用它作数据库的服务器,所以重点推荐下。

 

 二、MySQL的线上安装我建议采取编译安装的方法,这样性能上有较大提升,服务器系统我建议用64bit的Centos5.5,源码包的编译参数会默

认以Debgu模式生成二进制代码,而Debug模式给MySQL带来的性能损失是比较大的,所以当我们编译准备安装的产品代码时,一定不要忘记使用“—

without-debug”参数禁用Debug模式。而如果把—with-mysqld-ldflags和—with-client-ldflags二

个编译参数设置为—all-static的话,可以告诉编译器以静态方式编译和编译结果代码得到最高的性能。使用静态编译和使用动态编译的代码相比,性能

差距可能会达到5%至10%之多。我参考了简朝阳先生的编译参数,特列如下,供大家参考

./configure

–prefix=/usr/local/mysql –without-debug –without-bench

–enable-thread-safe-client –enable-assembler –enable-profiling

–with-mysqld-ldflags=-all-static –with-client-ldflags=-all-static

–with-charset=latin1 –with-extra-charset=utf8,gbk –with-innodb

–with-csv-storage-engine –with-federated-storage-engine

–with-mysqld-user=mysql –without-我是怎么了ded-server

–with-server-suffix=-community

–with-unix-socket-path=/usr/local/mysql/sock/mysql.sock

三、MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何 *** 作的。对 MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。

下面,我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明:

#vim /etc/my.cnf

以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略。

[mysqld]

port = 3306

serverid = 1

socket = /tmp/mysql.sock

skip-locking

#避免MySQL的外部锁定,减少出错几率增强稳定性。

skip-name-resolve

#禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

back_log = 384

 

 #back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。

如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的 *** 作系统在这个队列大小上有它自

己的限制。 试图设定back_log高于你的 *** 作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。

key_buffer_size = 384M

#key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低!

max_allowed_packet = 4M

thread_stack = 256K

table_cache = 614K

sort_buffer_size = 6M

#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。

read_buffer_size = 4M

#读查询 *** 作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。

join_buffer_size = 8M

#联合查询 *** 作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。

myisam_sort_buffer_size = 64M

table_cache = 512

thread_cache_size = 64

query_cache_size = 64M

 

 #指定MySQL查询缓冲区的大小。可以通过在MySQL控制台观察,如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不

的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓

冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。

tmp_table_size = 256M

max_connections = 768

#指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示,则需要增大该参数值。

max_connect_errors = 1000

wait_timeout = 10

#指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。

thread_concurrency = 8

#该参数取值为服务器逻辑CPU数量*2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4*2=8;这个目前也是双四核主流服务器配置。

skip-networking

#开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

table_cache=1024

#物理内存越大,设置就越大。默认为2402,调到512-1024最佳

innodb_additional_mem_pool_size=4M

#默认为2M

innodb_flush_log_at_trx_commit=1

#设置为0就是等到innodb_log_buffer_size列队满后再统一储存,默认为1

innodb_log_buffer_size=2M

#默认为1M

innodb_thread_concurrency=8

#你的服务器CPU有几个就设置为几,建议用默认一般为8

key_buffer_size=256M

#默认为218,调到128最佳

tmp_table_size=64M

#默认为16M,调到64-256最挂

read_buffer_size=4M

#默认为64K

read_rnd_buffer_size=16M

#默认为256K

sort_buffer_size=32M

#默认为256K

thread_cache_size=120

#默认为60

query_cache_size=32M

※值得注意的是:

很多情况需要具体情况具体分析

一、如果Key_reads太大,则应该把my.cnf中Key_buffer_size变大,保持Key_reads/Key_read_requests至少1/100以上,越小越好。

二、如果Qcache_lowmem_prunes很大,就要增加Query_cache_size的值。

 

 很多时候我们发现,通过参数设置进行性能优化所带来的性能提升,可能并不如许多人想象的那样产生质的飞跃,除非是之前的设置存在严重不合理的情况。我们

不能将性能调优完全依托于通过DBA在数据库上线后进行的参数调整,而应该在系统设计和开发阶段就尽可能减少性能问题。

【51CTO独家特稿】如果单MySQL的优化始终还是顶不住压力时,这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了,目前可行的方案有:

一、MySQL Cluster

优势:可用性非常高,性能非常好。每份数据至少可在不同主机存一份拷贝,且冗余数据拷贝实时同步。但它的维护非常复杂,存在部分Bug,目前还不适合比较核心的线上系统,所以这个我不推荐。

二、DRBD磁盘网络镜像方案

 

 优势:软件功能强大,数据可在底层快设备级别跨物理主机镜像,且可根据性能和可靠性要求配置不同级别的同步。IO *** 作保持顺序,可满足数据库对数据一致

性的苛刻要求。但非分布式文件系统环境无法支持镜像数据同时可见,性能和可靠性两者相互矛盾,无法适用于性能和可靠性要求都比较苛刻的环境,维护成本高于

MySQL Replication。另外,DRBD也是官方推荐的可用于MySQL高可用方案之一,所以这个大家可根据实际环境来考虑是否部署。

三、MySQL Replication

 

 在实际应用场景中,MySQL

Replication是使用最为广泛的一种提高系统扩展性的设计手段。众多的MySQL使用者通过Replication功能提升系统的扩展性后,通过

简单的增加价格低廉的硬件设备成倍

甚至成数量级地提高了原有系统的性能,是广大MySQL中低端使用者非常喜欢的功能之一,也是许多MySQL使用者选择MySQL最为重要的原因。

比较常规的MySQL Replication架构也有好几种,这里分别简单说明下

MySQL Replication架构一:常规复制架构--Master-slaves,是由一个Master复制到一个或多个Salve的架构模式,主要用于读压力大的应用数据库端廉价扩展解决方案,读写分离,Master主要负责写方面的压力。

MySQL Replication架构二:级联复制架构,即Master-Slaves-Slaves,这个也是为了防止Slaves的读压力过大,而配置一层二级 Slaves,很容易解决Master端因为附属slave太多而成为瓶劲的风险。

MySQL Replication架构三:Dual Master与级联复制结合架构,即Master-Master-Slaves,最大的好处是既可以避免主Master的写 *** 作受到Slave集群的复制带来的影响,而且保证了主Master的单点故障。

以上就是比较常见的MySQL replication架构方案,大家可根据自己公司的具体环境来设计 ,Mysql 负载均衡可考虑用LVS或Haproxy来做,高可用HA软件我推荐Heartbeat。

 

 MySQL

Replication的不足:如果Master主机硬件故障无法恢复,则可能造成部分未传送到slave端的数据丢失。所以大家应该根据自己目前的网络

规划,选择自己合理的Mysql架构方案,跟自己的MySQL

DBA和程序员多沟涌,多备份(备份我至少会做到本地和异地双备份),多测试,数据的事是最大的事,出不得半点差错

有八个方面可以对mysql进行优化:

1、选取最适用的字段属性

MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。

2. 使用连接(JOIN)来代替子查询(Sub-Queries)

MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。

3、使用联合(UNION)来代替手动创建的临时表

MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。

4、事务

尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库 *** 作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的 *** 作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的 *** 作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都 *** 作成功,要么都失败

5、锁定表

尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。

6、使用外键

锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。

7、使用索引

索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。

8、优化的查询语句

绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

由于MySQL服务器具有多种安装分发,而且能够运行在多种 *** 作平台之上,因此它的启动与停止的方法也多种多样。你可以根据实际情况使用其中的一种。在你安装、升级或者维护系统时,你可能需要多次启动和终止服务器,你需要了解启动和终止服务器的方方面面。

3.1.1 直接运行守护程序

1、你可以采用的方法

一般的,你可以有以下几种选择启动MySQL服务器,它们的功能和用法几乎是相同的,所以一起在这里介绍:

 直接使用MySQL守护程序mysqld启动数据库系统,尤其是Win32平台上的分发,这是因为,在Win32平台上没有mysql.server等服务器脚本可用。

 通过调用safe_mysqld脚本,它接受与mysqld相同的参数,并试图为mysqld决定正确的选项,然后选择用那些运行它。

2、脚本或者守护程序的存放位置

对于二进制分发的安装,mysqld守护程序安装在MySQL安装目录的bin目录下,或者可在MySQL源代码分发的libexec目录下找到,缺省为/usr/local/libexec/。对于rpm分发,mysqld应该位于PATH变量决定的程序搜索路径中,因此可以直接引用。

safe_mysqld仍旧是一个脚本,并且只存在于Unix平台的分发中。safe_mysqld脚本安装在MySQL安装目录的bin目录下,或可在MySQL源代码分发的scripts目录下找到。对于rpm分发,该脚本应该位于PATH变量决定的程序搜索路径中,因此可以直接引用。

3、为什么要使用safe_mysqld脚本

safe_mysqld接受和mysqld同样的参数,并试图确定服务器程序和数据库目录的位置,然后利用这些位置调用服务器。safe_mysqld将服务器的标准错误输出重定向到数据库目录中的错误文件中,并以记录的形式存在。启动服务器后,safe_mysqld还监控服务器,并在其死机时重新启动。safe_mysqld通常用于Unix的BSD风格的版本。

如果,你曾经为root或在系统启动程序中启动safe_mysqld,其错误日志将有root拥有。如果再用非特权的用户身份调用safe_mysqld,则可能引起“Access Denied”(即,“所有权被拒绝”)的错误。此时可以删除错误文件在试一次。

由于safe_mysqld脚本的功能,使用safe_mysqld脚本明显比直接启动mysqld守护程序来得有效。

4、启动服务器的完整过程

对于Unix平台上的分发,如果你以root或在系统引导期间启动sqfe_mysqld,出错日志由root拥有,这可能在你以后试图用一个非特权用户调用safe_mysqld时将导致“permission denied”(权限拒绝)错误,删除出错日志再试一下。因此建议你在启动服务器前,首先切换到一个专门的用户mysql。

具体方法如下:

 Unix平台

$ su mysql

$ safe_mysql &(或者 mysqld &,不推荐)

 Win32平台

C: mysqlin>mysqld --standalone

或者C: mysqlin>mysqld-nt –standalone

如果你使用mysqld并且没有把mysql安装在标准的位置,通常需要提供—basedir选项你的数据库的安装位置。

$safe_mysqld --basedir=”/path/to/mysql” &(Unix平台)

c:mysqlin>mysqld --basedir=”x:/path/to/mysql” (Win32平台)

5、使用safe_mysqld脚本实现服务器的自动启动

同样你可以利用safe_mysqld和mysqld实现服务器随 *** 作系统自动启动。对于Linux系统以及BSD风格的系统(FreeBSD,OpenBSD等)),通常在/etc目录下有几个文件在引导时初始化服务,这些文件通常有以“rc”开头的名字,且它有可能由一个名为“rc.local”的文件(或类似的东西),特意用于启动本地安装的服务。

在这样的系统上,你可能将类似于下列的行加入rc.local文件中以启动服务器(如果safe_mysqld的目录在你的系统上不同,修改它即可):

if [ -x /usr/local/bin/safe_mysqld ]then /usr/local/bin/safe_mysqld &fi

由于这样在引导时启动,将使用root身份启动数据库,在某些时候可能会产生问题和麻烦。这是你可以指定--user选项,因此可以将上面的代码修改为:

if [ -x /usr/local/bin/safe_mysqld ]then

/usr/local/bin/safe_mysqld --user=mysql --datadir=/path/to/data &

fi

3.1.2 使用脚本mysql.server启动关闭数据库

对于Unix平台上的分发,比较好的办法是使用数据库脚本mysql.server,启动和关闭数据库。

1、mysql.server脚本的存放位置

mysql.server脚本安装在MySQL安装目录下的share/mysqld目录下或可以在MySQL源代码分发的support_files目录下找到。对于rpm分发,该脚本已经改名mysql位于/etc/rc.d/init.d目录中,另外在….中存在一个副本mysql.server。下文的讨论对RPM分发来说,都在安装中完成了。如果你想使用它们,你需要将它们拷贝到适当的目录下。

2、如何使用mysql.server脚本启动停止服务器

mysql.server脚本可以被用来启动或停止服务器,通过用start或stop参数调用它:

$ mysql.server start

$ mysql.server stop

3、mysql.server的功能简述

在mysql.server启动服务器之前,它把目录改变到MySQL安装目录,然后调用safe_mysqld。如果你有在一个非标准的地点安装的二进制分发,你可能需要编辑mysql.server。修改它,运行safe_mysqld前,cd到正确的目录。

4、让mysql.server以特定的用户启动服务器

如果你想要作为一些特定的用户运行服务器,你可以改变mysql_daemon_user=root行使用其他用户,你也能修改mysql.server把其他选项传给safe_mysqld。

当然你也可以利用选项文件给mysql.server脚本提供参数。

你也可以在一个全局“/etc/my.cnf”文件中增加mysql.server的选项。一个典型的“/etc/my.cnf”文件可能看起来像这样:

[mysqld]

datadir=/usr/local/mysql/var

socket=/tmp/mysqld.sock

port=3306

[mysql.server]

user=mysql

basedir=/usr/local/mysql

mysql.server脚本使用下列变量:user、datadir、basedir、bindir和pid-file。

5、利用mysql.server脚本让服务器自动启动

mysql.server脚本的重要性在于你可以使用它配置一个随 *** 作系统自动启动的数据库安装,这是一个实际的系统中常用的方法。

 把mysql.server复制到/etc/rc.d/init.d目录里面:

# cd /etc/rc.d/init.d

# cp /usr/local/mysql/support-files/mysql.server mysql

 接着把它的属性改为“x”(executable,可执行)

# chmod +x mysql

 最后,运行chkconfig把MySQL添加到你系统的启动服务组里面去。

# /sbin/chkconfig --del mysql

# /sbin/chkconfig --add mysql

你也可以这样做,手工建立链接:

#cd /etc/rc.d/rc3.d (根据你的运行级不同而不同,可以是rc5.d)

#ln –s ../init.d/mysql S99mysql

在系统启动期间,S99mysql脚本利用start参数自动启动。

3.1.3 使用mysqladmin实用程序关闭、重启数据库

日常维护数据库,经常需要关闭或者重新启动数据库服务器。mysql.server stop只能用于关闭数据库系统,并不方便,而且mysql.server脚本用特定用户身份启动服务器,因此使用该教本需要超级用户的权限。相比之下mysqladmin就方便的多,并且适用于MySQL所有类型、平台的安装。

 关闭数据库服务器

mysqladmin shutdown

 重启数据库服务器

mysqladmin reload

 获得帮助

mysqladmin –help

mysqladmin实用程序非常有使用价值,仔细阅读帮助输出,你会得到更多的用法。

如果出现下面的错误:

mysqladmin: connect to server at ’localhost’ failed

error: ’Access denied for user: ’root@localhost’ (Using password: YES)’

表示你需要一个可以正常连接的用户,请指定-u -p选项,具体方法与3.2节介绍相同,在第七章中你将会学到用户授权的知识。例如,你现在可以:

shell>mysqladmin -u root -p shutdown

Enter Password:***********

输入你在阅读第二章时修改过的密码即可。

3.1.4 启动或停止NT平台上的系统服务

上面几节介绍了Unix平台上使数据库服务器自动启动的方法,而在windows(NT)平台上为了让MySQL数据库自动启动,你需要将MySQL服务器安装成NT系统的一种服务。

1、将MySQL安装成系统服务

对于NT,服务器名字是mysqld-nt。

C:mysqlin>mysqld-nt --install

(你可以在 NT 上使用mysqld或mysqld-opt服务器,但是那些不能作为一种服务启动或使用命名管道。)

2、修改选项文件

如果你的mysql没有安装缺省的位置c:mysql,那么因为数据库将无法确定数据库目录的位置,而无法启动。这种情况下,你需要提供一个全局的选项文件c:my.cnf。将安装目录中的my-example.cnf文件拷贝到c盘根目录下。修改或加入:

[mysqld]

basedir = x:/path/to/mysql/

3、启动、停止服务器的方法

你可以用下列命令启动和停止MySQL服务:

NET START mysql

NET STOP mysql

注意在这种情况下,你不能对mysqld-nt使用任何其他选项!你需要使用选项文件提供参数。可以在选项文件中提供合适的参数。

3.1.5 使用选项文件提供服务器的参数

本节介绍守护程序需要的比较重要的选项。

对于全局选项文件(windows:c:/my.cnf 或者 unix:/etc/my.cnf),比较重要的选项有:

user 运行守护程序的用户,如果你使用mysql.server,并且在[mysql.server]中指定了user,那么这个选项没有必要。

log-update=file 更新日志名,对于恢复数据库有重要意义,数据库服务器将生成file.n为名的更新日志文件。

-l, --log[=file] 指定常规日志名

--log-bin[=file] 指定使用的二进制日志文件,应用于服务器复制。

-Sg, --skip-grant-tables 启动时不加载授权表,维护时使用。

-u, --user=user_name 启动服务器使用的Unix帐户

--socket=... 指定是用的Unix套接字文件名,在同时运行多个服务器时使用。

-P, --port=... 指定服务器使用的端口,在同时运行多个服务器时使用。

3.1.6 总结

作为MySQL的管理员,你平时的指责就是确保服务器尽可能的正常运行,使得客户机能够正常访问。本章讨论了如何启动和重启、关闭服务器,如果你具备了这个能力,就可以更好的维护服务器安装。本章介绍的方法,多数适合于Unix系统,读者请仔细分辨。

3.2 MySQL与客户机的连接

本章通过演示如何使用mysql客户程序与数据库服务器连接。mysql(有时称为“终端监视器”或只是“监视”)是一个交互式程序,允许你连接一个MySQL服务器,运行查询并察看结果。mysql可以用于批模式:你预先把查询放在一个文件中,然后告诉mysql执行文件的内容。使用mysql的两个方法都在这里涉及。

为了看清由mysql提供的一个选择项目表了,用--help选项调用它:

shell>mysql --help

本章假定mysql已经被安装在你的机器上,并且有一个MySQL服务器你可以连接。如果这不是真的,联络你的MySQL管理员。(如果你是管理员,你将需要请教这本手册的其他章节。)

3.2.1建立和中止与服务器的连接

1、如何使用客户机建立连接

为了连接到服务器,从外壳程序(即从 UNIX 提示符,或从 Windows 下的 DOS 控制台)激活 mysql 程序。命令如下:

shell>mysql

又如,直接连接一个数据库:

shell>mysql db_name

其中的“$”在本书中代表外壳程序提示符。这是 UNIX 标准提示符之一;另一个为“#”。在 Windows 下,提示符类似 “c:>”。

2、客户机最常使用的选项:主机、用户和密码

为了连接服务器,当你调用mysql时,你通常将需要提供一个MySQL用户名和很可能,一个口令。如果服务器运行在不是你登录的一台机器上,你也将需要指定主机名。联系你的管理员以找出你应该使用什么连接参数进行连接(即,那个主机,用户名字和使用的口令)。一旦你知道正确的参数,你应该能象这样连接:

shell>mysql -h host -u user -p

Enter password: ********

********代表你的口令;当mysql显示Enter password:提示时输入它。

在刚开始学习 MySQL 时,大概会为其安全系统而烦恼,因为它使您难于做自己想做的事。(您必须取得创建和访问数据库的权限,任何时候连接到数据库都必须给出自己的名字和口令。)但是,在您通过数据库录入和使用自己的记录后,看法就会马上改变了。这时您会很欣赏 MySQL 阻止了其他人窥视(或者更恶劣一些,破坏!)您的资料。

下面介绍选项的含义:

-h host_name(可选择形式:--host=host_name)

希望连接的服务器主机。如果此服务器运行在与 mysql 相同的机器上,这个选项一般可省略。

 -u user_name(可选择的形式:--user=user_name)

您的 MySQL 用户名。如果使用 UNIX 且您的 MySQL 用户名与注册名相同,则可以省去这个选项;mysql 将使用您的注册名作为您的 MySQL 名。

在 Windows 下,缺省的用户名为 ODBC。这可能不一定非常有用。可在命令行上指定一个名字,也可以通过设置 USER 变量在环境变量中设置一个缺省名。如用下列 set 命令指定 paul 的一个用户名:

 -p(可选择的形式:--password)

这个选项告诉 mysql 提示键入您的 MySQL 口令。注意:可用 -pyour_password 的形式(可选择的形式:--password=your_password)在命令行上键入您的口令。但是,出于安全的考虑,最好不要这样做。选择 -p 不跟口令告诉 mysql 在启动时提示您键入口令。例如:

在看到 Enter password: 时,键入口令即可。(口令不会显到屏幕,以免给别人看到。)请注意,MySQL 口令不一定必须与 UNIX 或 Windows 口令相同。

如果完全省略了 -p 选项,mysql 就认为您不需要口令,不作提示。

请注意:-h 和 -u 选项与跟在它们后面的词有关,无论选项和后跟的词之间是否有空格。而 -p 却不是这样,如果在命令行上给出口令,-p 和口令之间一定不加空格。

例如,假定我的 MySQL 用户名和口令分别为 tom 和 secret,希望连接到在我注册的同一机器上运行的服务器上。下面的 mysql 命令能完成这项工作:

shell>mysql –u tom -p

在我键入命令后,mysql 显示 Enter password: 提示键入口令。然后我键入口令(****** 表明我键入了 secret)。

如果一切顺利的话,mysql 显示一串消息和一个“mysql>”提示,表示它正等待我发布查询。完整的启动序列如下所示:

为了连接到在其他某个机器上运行的服务器,需要用 -h 指定主机名。如果该主机为 mysql.domain.net,则相应的命令如下所示:

shell>mysql –h mysql.domain.net –u tom -p

在后面的说明 mysql 命令行的多数例子中,为简单起见,我们打算省去 -h、-u 和 -p 选项。并且假定您将会提供任何所需的选项。

有很多设置账号的方法,从而不必在每次运行 mysql 时都在连接参数中进行键入。这个问题在前面已经介绍过,你只需在选项文件中提供参数,具体请看3.2.2。您可能会希望现在就跳到该节,以便找到一些更易于连接到服务器的办法。

3、结束会话

在建立了服务器的一个连接后,可在任何时候键入下列命令来结束会话:

quit exit

还可以键入 Control-D 来退出,至少在 UNIX 上可以这样。

3.2.2利用选项文件简化连接

在激活 mysql 时,有可能需要指定诸如主机名、用户名或口令这样的连接参数。运行一个程序需要做很多输入工作,这很快就会让人厌烦。利用选项文件可以存储连接参数,减少输入工作。

例如,对于使用mysqladmin客户机来管理数据库,那么你很快会厌烦每次使用这么长的命令行:

shell>mysql –u root –p varialbles

Enter password: *********

你也许会选择使用全局选项文件来存贮你的参数:

[mysqladmin]

#也可以用[client],为所有的客户机存储参数

user=root

password=yourpassword

这样执行mysqladmin variables就不会显示任何存储拒绝的错误,并且你可以用root用户身份维护数据库了。

且慢,你立刻会发现,这样做是一个很大的安全漏洞,因为任何可以读取选项文件的用户都可以获得你的密码!解决方法是,只提供password选项不提供密码:

[mysqladmin]

user=root

password

这样你在命令行执行时,会提示你数据密码:

shell>mysql varialbles

Enter password: *********

但是,你不能不提供password选项,否则你还是要在命令行中提供-p选项。

3.2.3 利用 mysql 的输入行编辑器

mysql 具有内建的 GNU Readline 库,允许对输入行进行编辑。可以对当前录入的行进行处理,或调出以前输入的行并重新执行它们(原样执行或做进一步的修改后执行)。在录入一行并发现错误时,这是非常方便的;您可以在按 Enter 键前,在行内退格并进行修正。如果录入了一个有错的查询,那么可以调用该查询并对其进行编辑以解决问题,然后再重新提交它。(如果您在一行上键入了整个查询,这是最容易的方法。)

表2-1中列出了一些非常有用的编辑序列,除了此表中给出的以外,还有许多输入编辑命令。利用因特网搜索引擎,应该能够找到 Readline手册的联机版本。此手册也包含在 Readline 分发包中,可在 http://www.gnu. org/ 的 Gnu Web 站点得到。

表2-1 mysql 输入编辑命令

键 序 列 说 明

Up 箭头,Ctrl-p 调前面的行

Down 箭头,Ctrl-N 调下一行

Left 箭头,Ctrl-B 光标左移(向后)

Right 箭头,Ctrl-F 光标右移(向前)

Escape Ctrl-B 向后移一个词

Escape Ctrl-F 向前移一个词

Ctrl-A 将光标移到行头

Ctrl-E 将光标移到行尾

Ctrl-D 删除光标下的字符

Delete 删除光标左边的字符

Escape D 删词

Escape Backspace 删除光标左边的词

Ctrl-K 删除光标到行尾的所有字符

Ctrl-_ 撤消最后的更改;可以重复

下面的例子描述了输入编辑的一个简单的使用。假定用 mysql 输入了下列查询:

如果在按 Enter 前,已经注意到将“president”错拼成了“persident”,则可按左箭头或 Ctrl-B 多次移动光标到“s”的左边。然后按 Delete 两次删除“er”,键入“re”改正错误,并按 Enter 发布此查询。如果没注意到错拼就按了 Enter,也不会有问题。在 mysql 显示了错误消息后,按上箭头或 Ctrl-P 调出该行,然后对其进行编辑。

输入行编辑在 mysql 的 Windows 版中不起作用,但是可从 MySQL Web 站点取得免费的 cygwin_32 客户机分发包。在该分发包中的mysqlc 程序与 mysql 一样,但它支持输入行编辑命令。

3.2.4 批处理模式连接

在前面的章节中,你交互式地使用mysql输入查询并且查看结果。你也可以以批模式运行mysql。为了做到这些,把你想要运行的命令放在一个文件中,然后告诉mysql从文件读取它的输入:

shell>mysql <batch-file

如果你需要在命令行上指定连接参数,命令可能看起来像这样:

shell>mysql -h host -u user -p <batch-file

Enter password: ********

当你这样使用mysql时,你正在创建一个脚本文件,然后执行脚本。

为什么要使用一个脚本?有很多原因:

 如果你重复地运行查询(比如说,每天或每周),把它做成一个脚本使得你在每次执行它时避免重新键入。

 你能通过拷贝并编辑脚本文件从类似的现有的查询生成一个新查询。

 当你正在开发查询时,批模式也是很有用的,特别对多行命令或多行语句序列。如果你犯了一个错误,你不必重新打入所有一切,只要编辑你的脚本来改正错误,然后告诉mysql再次执行它。

 如果你有一个产生很多输出的查询,你可以通过一个分页器而不是盯着它翻屏到你屏幕的顶端来运行输出:

$ mysql <batch-file | more

 你能捕捉输出到一个文件中进行更一步的处理:

shell>mysql <batch-file >mysql.out

 你可以散发脚本给另外的人,因此他们也能运行命令。

 一些情况不允许交互地使用,例如, 当你从一个cron任务中运行查询时。在这种情况下,你必须使用批模式。

当你以批模式运行mysql时,比起你交互地使用它时,其缺省输出格式是不同的(更简明些)。例如,当交互式运行SELECT DISTINCT species FROM pet时,输出看起来像这样:

+---------+

| species |

+---------+

| bird |

| cat |

| dog |

| hamster |

| snake |

+---------+

但是当以批模式运行时,像这样:

species

bird

cat

dog

hamster

snake

如果你想要在批模式中得到交互的输出格式,使用mysql -t。为了回显以输出被执行的命令,使用mysql -vvv。

3.2.5 总结

本章中列举了客户机与服务器连接的几种情况,读者需要注意的是下面几点:

1、 如何提供参数,以及参数的意义

2、 如何让客户机提示输入密码

3、 交互模式和批处理模式

4、 mysql客户机的行编辑功能

3.3 有关数据库的 *** 作

从本节开始正式介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关 *** 作,查看、建立和删除等 *** 作。

3.3.1 用SHOW显示已有的数据库

句法:SHOW DATABASES [LIKE wild]

如果使用LIKE wild部分,wild字符串可以是一个使用SQL的“%”和“_”通配符的字符串。

功能:SHOW DATABASES列出在MySQL服务器主机上的数据库。

你可以尝试下面举例,观察输出结果,例如:

mysql>show databases

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

| Database |

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

| first |

| mysql |

| mytest |

| test |

| test1 |

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

mysql>show databases like ‘my%’

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

| Database (my%) |

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

| mysql |

| mytest |

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

用mysqlshow程序也可以得到已有数据库列表。

3.3.2 用Create Dabase 创建数据库

句法:CREATE DATABASE db_name

功能:CREATE DATABASE用给定的名字创建一个数据库。

如果数据库已经存在,发生一个错误。

在MySQL中的数据库实现成包含对应数据库中表的文件的目录。因为数据库在初始创建时没有任何表,CREATE DATABASE语句只是在MySQL数据目录下面创建一个目录。

例如:

mysql>create database myfirst

然后利用show databases观察效果。

3.3.3 用DROP DATABASE删除数据库

句法:DROP DATABASE [IF EXISTS] db_name

功能:DROP DATABASE删除数据库中的所有表和数据库。要小心地使用这个命令!

DROP DATABASE返回从数据库目录被删除的文件的数目。通常,这3倍于表的数量,因为每张表对应于一个“.MYD”文件、一个“.MYI”文件和一个“.frm”文件。

在MySQL 3.22或以后版本中,你可以使用关键词IF EXISTS阻止一个错误的发生,如果数据库不存在。

3.3.4 使用mysqladmin工具创建和删除

在命令行环境下可以使用mysqladmin创建和删除数据库。

创建数据库:

shell>mysqladmin create db_name

删除数据库:

shell>mysqladmin drop db_name

如果出现下面的错误:

mysqladmin: connect to server at ’localhost’ failed

error: ’Access denied for user: ’root@localhost’ (Using password: YES)’

表示你需要一个可以正常连接的用户,请指定-u -p选项,具体方法与3.2节介绍相同,在第七章中你将会学到用户授权的知识。

3.3.5 直接在数据库目录中创建或删除

用上述方法创建数据库,只是MySQL数据目录下面创建一个与数据库同名目录,同样删除数据库是把这个目录删除。

所以,你可以直接这么做,创建或删除数据库,或者给数据库更名。这对备份和恢复备份有一定意义。

3.3.6 用USE选用数据库

句法:USE db_name

USE db_name语句告诉MySQL使用db_name数据库作为随后的查询的缺省数据库。数据库保持到会话结束,或发出另外一个USE语句:

mysql>USE db1

mysql>SELECT count(*) FROM mytable# selects from db1.mytable

mysql>USE db2

mysql>SELECT count(*) FROM mytable# selects from db2.mytable

如果你不是用USE语句,那么上面的例子应该写成:

mysql>SELECT count(*) FROM db1.mytable

mysql>SELECT count(*) FROM db2.mytable

由于use也是一个mysql客户程序的命令,所以你可以在命令行最后不加分号,客户程序可以得到结果。

3.3.7 总结

本节介绍了有关数据库 *** 作的SQL语句、实用程序,其中包括:

 SQL语句:CREATE/DROP DATABASE,SHOW DATABASES,USE

 程序mysqladmin

 直接创建或删除数据库的目录

3.4 有关数据表的 *** 作

用MySQL,目前(版本 3.23)你可以在三种基本数据库表格式间选择。当你创建一张表时,你可以告诉MySQL它应该对于表使用哪个表类型。MySQL将总是创建一个.frm文件保存表和列定义。视表类型而定,索引和数据将在其他文件中存储。

你能用ALTER TABLE语句在不同类型的表之间变换。见7.8 ALTER TABLE语法。

 MyISAM

在MySQL 3.23中,MyISAM是缺省表格类型,它是基于ISAM代码并且有很多有用的扩展。索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中。你能用myisamchk实用程序检查/修复MyISAM表。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6698191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存