使用mysql客户端连接mysql服务器
2013-02-01 21:17:57 阿炯

MySQL客户端程序可以在命令行中被调用,在调用时可以定义相关参数,参数可以通过命令行指定,也可以使用参数文件来指定。MySQL客户端程序的选项有两种形式:
长选项:使用双”-”后跟单词选项。
短选项:使用单”-”后跟字母选项。

对于大多数选项,都带有长选项和短选项两种形式,有些选项可以带有选项值。例如在使用-host和-h来指定我们要连接到的MySQL服务器的主机地址时,你可以在后面加上主机地址的值。对于长选项,使用”=”来分隔选项值。对于短选项,直接在选项后面跟选项值或者选项后面跟一个空格,然后在跟选项值,如下命令:
shell> mysql --host=myhost.freeoa.net
shell> mysql -h myhost.freeoa.net
shell> mysql -hmyhost.freeoa.net

连接参数选项
要连接的MySQL服务器,我们需要知道MySQL服务器的主机名(地址)、端口号,同时为了认证我们还需要提供所需的用户名和密码信息。下面是建立到MySQL服务器连接所需要的参数:

参数名    含义
--protocol    该连接所使用的协议
--host    MySQL服务器的主机名
--port    TCP/IP协议中的端口号
--shared-memory-base-name    共享内存协议中的共享内存名称
--socket    Unix下的socket名或windows下的命名管道名

下面对上面的参数做下描述:
--host=host_name或-h host_name
该选项指定了客户端要连接的MySQL服务器的主机地址,可以指定主机名或IP地址。默认值为localhost。

--port=port_number或-P port_number
该参数指定了连接到MySQL服务器的端口号。仅在协议为tcp时可用。默认值为3306。

--shared-memory-base-name=memory_name
用于windows环境下指定共享内存的名称。默认值为MYSQL,区分大小写。

--socket=socket_name 或-S socket_name
在Unix下用于指定socket名称。在Windows下用于指定管道名称。Unix下的默认值为:/tmp/mysql.sock,在Windows下为MYSQL。

MySQL服务器认证所需要的参数:
参数名    含义
--user    MySQL用户名
--password    MySQL密码

下面对认证所需的参数做了描述:
--user=user_name 或 -u user_name
该参数指定了MySQL账户的用户名信息。在Windows下该参数默认值ODBC,在Unix下该参数默认值是你的登录名。

--password=pass_value 或 -ppass_value
该参数指定了MySQL账户的密码信息。该参数没有默认值。如果忽略了此参数,MySQL会要求你录入。如果使用短选项方式,那么-p和密码间不能有空格。

如果给定了-protocol选项,则需要指定客户端连接到服务器端的协议类型,有效的协议类型包括:
协议类型    连接协议    适应系统
tcp    TCP/IP协议连接到本机或远程MySQL    所有系统
socket    Unix的socket文件连接到本机    Unix
pipe    本地命名管道连接到本机    Windows
memory    使用共享内存连接到本机    Windows

从上表可以看出,tcp协议是使用的最多的协议,它可以连接到本机的MySQL或远程的MySQL,同时也适应于所有的操作系统,对于其他类型的协议只能连接到本机的MySQL上。

对于命名管道(pipe)协议,只能用于Windows上连接到本机MySQL。然而要使用命名管道,MySQL服务器必须使用mysqld-nt或mysqld-max-nt来启动,并使用-enable-named-pipe选项。

共享内存(memory)只能用于Windows上连接到本机MySQL,MySQL服务器启动需要增加-shared-memory选项。

官方原文
--protocol Value    Connection Protocol    Permissible Operating Systems
TCP    TCP/IP connection to local or remote server    All
SOCKET    Unix socket file connection to local server    Unix only
PIPE    Named-pipe connection to local or remote server    Windows only
MEMORY    Shared-memory connection to local server    Windows only

TCP/IP connections are supported by any MySQL server unless the server is started with the -skip-networking option. These connections are supported by all type of Operating Systems and also connect from locally or remotely.

Unix socket file connections are supported by all Unix servers and this can be connect from local only.

Named-pipe connections are supported only by Windows servers and are disabled by default. To enable named-pipe connections, you have to start the mysql-nt server with the -enable-named-pipe option.

Shared-memory connections are supported by all Windows servers and are disabled by default. To enable shared-memory connections, you have to start the server with the -shared-memory option.

From the client perspective, a client run on the same host as the server can use any of the connection protocols that the server supports but If the client will run on a different host,connections always use TCP/IP. MySQL communication protocols are implemented by various libraries and program drivers. Client programs included with MySQL distributions like mysql, mysqladmin etc establish connections to the server using the native C client library.

The different connection methods are not all equally efficient. In many Windows configurations, communication via named pipes is much slower than using TCP/IP. You should use named pipes only when you choose to disable TCP/IP (using the -skip-networking parameter) or when you can confirm that named pipes actually are faster for your particular setup.

On Unix, a Unix socket file connection provides better performance than a TCP/IP connection. On any platform, an ODBC connection made via MySQL Connector/ODBC is slower than a connection established directly using the native C client library. This is because ODBC is layered on top of the C library, which adds overhead. On any platform, a JDBC connection made via MySQL Connector/J is likely to be roughly about the same speed as a connection established using the native C client library.


关于MySQL DBA

作为一个DBA,核心目标也是终极目标:保证数据库管理系统的稳定性、安全性、完整性和高性能。

MySQL DBA分为两种:一种是开发DBA,一种是运维DBA,这里说的MySQL DBA是指运维DBA。一般意义上的DBA指的是运维DBA,只是负责数据库的运营和维护,包括数据库的安装、监控、备份、恢复等基本工作,而高级或资深DBA职责比这个大得多,需要覆盖产品从需求设计、测试到交付上线的整个生命周期,在此过程中不仅要负责数据库管理系统的搭建和运维,更要参与到前期的数据库设计,中期的数据库测试和后期的数据库容量管理和性能优化。

对于运维DBA来说,主要的职责为以下几点:

1)监控:对数据库服务运行的状态进行实时的监控,包括数据库会话、数据库日志、数据文件碎片、表空间监控、用户访问监控等,随时发现数据库服务的运行异常和资源消耗情况;输出重要的日常数据库服务运行报表以评估数据库服务整体运行状况,发现数据库隐患;监控对于DBA来说是至关重要的,是DBA的第三只眼睛,利于监控可以自动处理一些常规的故障,提前发现并解决潜在隐患,监控对于运维是必备的技能,如果你不懂监控,那么你就不是一个称职的运维人员;

2)备份:制定和实施数据库备份计划,灾难出现时对数据库信息进行恢复,维护适当介质上的存档或者备份数据。对数据库的备份策略要根据实际要求进行更改,数据的日常备份情况进行监控。

3)安全审计:为不同的数据库管理系统用户规定不同的访问权限,以保护数据库不被未经授权的访问和破坏。例如,允许一类用户只能检索数据,而另一类用户可能拥有更新数据和删除记录的权限。

4)故障处理:对数据库服务出现的任何异常进行及时处理,尽可能避免问题的扩大化甚至中止服务。这之前DBA需要针对各类服务异常,如机房/网络故障、程序bug等问题制定处理的预案,问题出现时可以自动或手动执行预案达到止损的目的。

5)容量管理:包括数据库规模扩张后的资源评估、扩容、机房迁移、流量调度等规划和具体实施。

6)数据库性能优化:产品对外提供服务最重要的一点是用户体验,用户体验中非常重要的是产品的可用性和响应速度。而如何用最合理的资源支持产品提供高可用和高速度的用户体验,这也是DBA的重要职责。

个人认为,一个好的DBA所需要具备的基本技能包含:理解数据备份/恢复与灾难恢复、DBA常用工具集的使用、知道如何快速寻找答案、知道如何监控和优化数据库性能、尽可能实现自动化、容量监控与规划、索引设计、数据库设计、数据库安全性、持续不断地学习和研究新版本、可以单独的编写独立的或者系统的功能脚本。

关于经验
看简历描述公司项目的时候,会写上linux系统维护,mssql server项目,或者oracle data gard项目,一般如果有这些,工作在3年到4年,写上2年专职MySQL DBA管理经验,可以从下面来了解:
(1)复制原理
(2)binlog的日志格式的种类和分别
(3)innodb事务与日志的实现
(4)innodb与myisam的索引实现方式的理解
.........


这个对于数据库设计我真的没有太多的经验,也就只能问问最基础的,mysql中varchar(60) 60是啥含义,int(30)中30是啥含义? 如果都回答对了,那么就问mysql中为什么要这么设计呢? 如果他还回答对了,就继续问int(20)存储的数字的上限和下限是多少?

int(M) 里面的数值到底是什么意思

int(M) zerofill,加上zerofill后M才表现出有点效果,比如 int(3) zerofill,插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加zerofill,则它们没有什么区别,M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关.

这里的M代表的并不是存储在数据库中存储的具体的长度,它只是的特定情况下(zerofill)决定显示的宽度罢了。其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你补全,当你超过3位时,就没有任何的影响。它们之间除了在存储的时候稍微有点区别外,在我们使用的时候是没有任何区别的。int(10)也可以代表2147483647这个值int(11)也可以代表。

关于mysql参数优化的经验
首先问线上mysql数据库是怎么安装的,如果说是rpm安装的,那么就直接问调优参数了,如果是源码安装的,那么就要问编译中的一些参数了,比如my.cnf以及存储引擎以及字符类型等等。然后从以下几个方面问起:
(1)mysql有哪些global内存参数,有哪些local内存参数。
(2)mysql的写入参数需要调整哪些?重要的几个写参数的几个值得含义以及适用场景,比如innodb_flush_log_at_trx_commit,sync_binlog等。
(3)读取的话,那几个全局的pool的值的设置,以及几个local的buffer的设置。
(4)还有就是著名的query cache了,以及query cache的适用场景了,这里有一个陷阱,就是高并发的情况下,比如高并发时query cache开还是不开,开了怎么保证高并发,不开又有何别的考虑?

熟悉mysql的锁机制
那么gap锁,next-key锁,以及innodb的行锁是怎么实现的,以及myisam的锁是怎么实现的等。

乐观锁和 MVCC 的区别

在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,如何保证事务的一致性和隔离性的,同时最大程度地并发。

当多个用户/进程/线程同时对数据库进行操作时,会出现3种冲突情形:
读-读,不存在任何问题
读-写,有隔离性问题,可能遇到脏读(会读到未提交的数据) ,幻影读等。
写-写,可能丢失更新

要解决冲突,一种办法是是锁,即基于锁的并发控制,比如2PL,这种方式开销比较高,而且无法避免死锁。

MVCC

多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前(看到)的数据库的快照。这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重复读

OCC

乐观并发控制(OCC)是一种用来解决写-写冲突的无锁并发控制,认为事务间争用没有那么多,所以先进行修改,在提交事务前,检查一下事务开始后,有没有新提交改变,如果没有就提交,如果有就放弃并重试。乐观并发控制类似自旋锁。乐观并发控制适用于低数据争用,写冲突比较少的环境。

多版本并发控制可以结合基于锁的并发控制来解决写-写冲突,即MVCC+2PL,也可以结合乐观并发控制来解决写-写冲突。