MySQL初始化以及客户端工具的使用
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是关系型数据库
关系型数据库通常是把所有的数据都组织成二维关系。之所以称为关系型数据库是因为他把数据组织在一个有字段和记录组成的二维关系表当中。并且在这个关系表之外提供了很多辅助性的工具以完成关系表中的关系的维持及数据访问等功能。
我们知道如果将数据存储为字符形式的时候有文本对象和二进制大对象。二进制大对象不会直接存储在数据库中,而是放在服务器的某一个路径上,而在数据库存储的知识该数据的指针。比如,存取一张高清壁纸,它不会将这个图片的内容直接写入数据库,而是将这个图片的绝对路径存放在数据库中的某一个字段内。这种关系我们称之为面向对象的关系型数据库。(RDBMS)。而现在很多关系型数据库还支持直接将xml格式的接口进行交互。
二.关系型数据库的分支
在90年代初,关系型数据库由Sybase,Informix,Oracle三家公司三足鼎立。这三家公司对公司的规划不同,Sybase和Informix的规划都是很有前瞻性的,而Oracle的目标很有精确,就是把它们的产品做好,最后Oracle不断地进行完善,很显然,走到最靠前的当然是Oracle。其中Sybase曾经是和Microsoft公司合作,当时处于某种原因Sybase退出和Microsoft公司的合作,最后Microsoft公司自己研发了SQL Server数据库,Informix公司则被IBM公司收购,现在Informix只是IBM的一个子项目公司,典型的数据库代表就是DB2。
早期MySQL是ab公司的,最后以10美元卖给了sun公司,不幸的是sun公司被Oracle公司收购了,而Oracle惯用的伎俩就是将竞争对手买下来再打入冷宫。所以在资本主义面前谈理想都是道德主义。sun公司被收购之后,MySQL也就归Oracle公司啦。Oracle和人们预想的一样,虽然在收购的时候承诺了5年之内不下手,但事实上在这期间MySQL以及被蹂躏了无数遍啦。所以像之前谷歌,Facebook等公司也从MySQL软件转向其他软件啦。而且在RHEL7版本的默认数据库已经将MySQL换成了MariaDB。
MySQL的原作者在sum公司被收购之后久另立门户了,在早起的MySQL的基础上提出了另外的一个分支叫MariaDB。事实上MariaDB在能够兼容mysql的基础上还整合了开源社区中的很强大的技术力量。我们知道mysql早起整合进来的存储引擎有一个是innodb,而innodb是属于innobase公司的,innobase公司早在2008年被Oracle收购啦。有幸的是在开源界总是不乏奇人的,比如说著名的percona公司,它是致力于mysql的优化方面已经取得了不菲成绩的一个组织,这个组织在早起的改进开源的innodb基础之上研发了增强版的innodb,命名为xtradb。如你所料,MariaDB的存储引擎就是用的xtradb。我们可以理解为MariaDB是MySQL进化之后的一个产品。google和Facebook等著名的世界互联网公司都很看好MariaDB并已经开始使用该软件啦。
其实google和Facebook还有其他的几家公司在早起的MySQL的技术理念的不同他们也开发了另一个互联网产品叫做webscaledb,专门为web而生的一个数据库系统。它柔和了MySQL,MariaDB,percona和innobase四家公司的技术的产品。
在开源的数据库产品中还有一个重要的产品叫做PostgreSQL(简称pgsql),事实上,早起名字叫做egresql,只是egresql在商业运作上跟Oracle竞争时完全败下阵来。以至于它销声匿迹的比Informix还要早。而事实上就关系型数据库来讲,pgsql在技术上要优秀的多。不过市场决定一切,因此MySQL可能是大家接触比较多的关系型数据库。
指定一提的另外一个关系型数据库叫做sqlite,它和mysql不一样,我们知道mysql是基于c/s架构,客户端和服务端是通过mysql协议进行通信的。而sqlite是一个简单,工作在本地,非服务化的一个API的关系型数据库接口(它的客户端和服务端是一体的)。注意,sqlite仅是一个引擎,sqlite主要用在嵌入式平台上又不得不用关系型数据库接口的这样的应用场景。再次强调一下,sqlite是一个非C./S架构,它纯粹是一个引擎API机制,背后的数据任然存储为文件系统上的简单文件,不做过多解析,但完全可以支持我们的程序员使用select,insert等机制对数据完成持久化。
三.MySQL的初始化
我们知道MySQL的安装方式有很多种,比如rpm,yum,源码安装,二进制方式安装MySQL等等。但是无论哪种方式安装的MySQL我们都需要做一个操作就是MySQL的初始化。而正确的初始化姿势我们分为两个操作。第一,提供配置文件;第二,删除匿名用户等等。
1.提供配置文件
相比之前接触过MySQL的童鞋都知道,MySQL默认的配置文件都是以“*.cnf”结尾的文件,它是集中式的配置文件,多个应用程序共用的配置文件。当然,也可以不这样玩,后期我会分享案例给大家。我们通过一条命令就可以查看MySQL的一些默认信息。即“[[email protected] ~]# mysql --help --verbose ”没错,通过这个命令我们就可以或得很多输出:
A>.显示mysqld程序启动时可用的选项,通常都是长选项;
B>.显示mysqld的配置文件中可用的服务变量;
C>.显示使用配置文件的方式,即:第一,它依次查找每个需要查找的文件,结果是所有文件并集;第二,如果某参数在多个文件中出现多次,后读取的最终生效。
2.重置用户信息
大家知道在一个新安装的服务器上有很多默认的用户,比如root以及一些匿名用户,他们都是没有密码的,这样是很不安全的,因此我们需要删除不必要的用户,以及给我们需要使用的用户设置密码以及授权操作。 我们知道MySQL用户名账号由两部分组成,即用户名和主机名([email protected]),其中“host”还可以使用通配符。如 “%”表示任意长度的任意字符,“_”表示匹配任意单个字符。
A.删除匿名用户
1 mysql> select user,host,password from user; 2 +-------------+-------------+-------------------------------------------+ 3 | user | host | password | 4 +-------------+-------------+-------------------------------------------+ 5 | root | localhost | | 6 | root | yinzhengjie | | 7 | root | 127.0.0.1 | | 8 | | localhost | | 9 | | yinzhengjie | | 10 | yinzhengjie | 10.%.%.% | *C260A4F79FA905AF65142FFE0B9A14FE0E1519CC | 11 +-------------+-------------+-------------------------------------------+ 12 6 rows in set (0.00 sec) 13 14 mysql> 15 mysql> 16 mysql> 17 mysql> 18 mysql> drop user ""@localhost; 19 Query OK, 0 rows affected (0.01 sec) 20 21 mysql> drop user ""@yinzhengjie; 22 Query OK, 0 rows affected (0.00 sec) 23 24 mysql> select user,host,password from user; 25 +-------------+-------------+-------------------------------------------+ 26 | user | host | password | 27 +-------------+-------------+-------------------------------------------+ 28 | root | localhost | | 29 | root | yinzhengjie | | 30 | root | 127.0.0.1 | | 31 | yinzhengjie | 10.%.%.% | *C260A4F79FA905AF65142FFE0B9A14FE0E1519CC | 32 +-------------+-------------+-------------------------------------------+ 33 4 rows in set (0.00 sec) 34 35 mysql>
B.给所有的root用户设置密码
1 第一种方式: 2 mysql > set password for [email protected] = password( ‘your_password‘); 3 第二种方法 4 mysql > update user set password = password(‘your_password‘) where user = ‘root‘; 5 mysql > flush peivileges; 6 第三种方式: 7 [[email protected] ~]#mysqladmin -u UserName -h Hot password ‘new_password‘ -p 8 [[email protected] ~]#mysqladmin -u UserName -h Host -p flush-privileges
四.连入MySQL服务器
1.MySQL协议
MySQL的客户端有很多种,不论是那种MySQL客户端连接mysqld服务器,都是需要使用mysql protocol协议。
2.MySQL接收连接请求
本地通信:
客户端与服务器端位于同一主机,而且还要基于127.0.0.1(localhost)地址或lo接口进行通信。Linux或是Unix操作系统则是通过Unix Sock,/tmp/mysql.scok,/var/lib/mysql/mysql.sock这些本地文件进行进程间的通信。Widows则是通过memory(共享内存) pipe(命名管道)的方式进行通信的。
远程通信:
客户端与服务器位于不同的主机,或在统一主机便使用非回环地址通信。而远程通信时,通常是基于套接字通信,即TCP Socket。
3.MySQL客户端工具
事实上MySQL的客户端工具有很多种,可不止mysql这一种哟(只不过mysql这个客户端时最著名的一个)。其他著名的客户端工具还有:mysqladmin,mysqldump,mysqlcheck等等。
客户端([client])通信的选项:
指定用户 : -u,--user=
指定主机名 : -h, --host=
指定密码 : -p, --password=
指定协议 : --protocol={tcp|socket|memory|pipe}
指定端口 : --port= #MySQL默认是3306端口
指定套接字 : --socket= # 例如:/tmp/mysql.sock
非客户端类的管理工具:myisamchk(监测工具)和myisampack(打包工具)。
4.mysql命令行选项
压缩传输 : -compress
字符集 : --default-character-set
显示版本号 : -V:
显示详细信息 : -v:
指定ca证书 : --ssl-ca
ca证书的文件夹: --ssl-capath (一般有多个CA证书,就可以指定一个目录)
客户端证书 : --ssl-cert
加密方式 : --ssl-cipher
使用的私钥 : --ssl-key
验证服务器端证书: --ssl-verify-server-cert
指定要使用的数据库:--database= -D
输出结果为html格式的文档::-H --html
输出结果为xml格式的文档: -X --xml:
发送命令时拒绝使用无where字句的uodate或delete命令: --safe-updates
5.mysql命令提示符
mysql> ---->等待输入命令
‘> ---->前面提供的‘未提供结束’,接下来那两行一样的道理。
”>
`>
—> ---->续航提示符
/*> ---->注释信息(结束就用户"*/",比如:/*yinzhengjie*>)
6.mysql的命令行编辑快捷键
ctrl+w:删除光标所在处之前的一个单词
ctrl+u:删除光标之前至行首的所有内容,并将其保存在缓存(buffer)当中。
ctrl+y:粘贴之前ctrl+w或ctrl+u删除的内容
ctrl+a:移动光标至行首
ctrl+e:移动光标至行尾
五.mysqladmin工具用法详解
mysqladmin可以让用户不进入mysql的交互界面,直接在命令行就可以运行SQL语句啦。命令格式:“mysqladmin [options] command [arg] [command[arg]] .....”,接下来,让我们一起研究一下mysqladmin的用法。这个命令其实很有用,尤其是你在写shell脚本的时候,操作数据的时候它的用法就可以大展身手了。
1.创建空数据库
1 [[email protected] ~]# mysqladmin create yinzhengjiedb #创建一个叫yinzhengjiedb的数据库。 2 [[email protected] ~]# mysql -e ‘show databases;‘ #我们可以用mysql的-e选项来进行验证是否创建成功、 3 +--------------------+ 4 | Database | 5 +--------------------+ 6 | information_schema | 7 | mysql | 8 | test | 9 | yinzhengjie | 10 | yinzhengjiedb | 11 +--------------------+ 12 [[email protected] ~]#
2.删除数据库
1 [[email protected] ~]# mysql -e ‘show databases;‘ 2 +--------------------+ 3 | Database | 4 +--------------------+ 5 | information_schema | 6 | mysql | 7 | test | 8 | yinzhengjie | 9 | yinzhengjiedb | 10 +--------------------+ 11 [[email protected] ~]# mysqladmin drop yinzhengjiedb 12 Dropping the database is potentially a very bad thing to do. 13 Any data stored in the database will be destroyed. 14 15 Do you really want to drop the ‘yinzhengjiedb‘ database [y/N] y #此处我们需要交互式输入一个y。 16 Database "yinzhengjiedb" dropped 17 [[email protected] ~]# mysql -e ‘show databases;‘ 18 +--------------------+ 19 | Database | 20 +--------------------+ 21 | information_schema | 22 | mysql | 23 | test | 24 | yinzhengjie | 25 +--------------------+ 26 [[email protected] ~]#