此情更待成追忆,只是当时已惘然。
--【唐】李商隐
第一章 数据库概述及分类特点应用
1.1 数据库种类、语言处理、典型产品
①数据库的理解:就是一个存放数据的仓库,这个仓库是按照一定的数据结构,来组织和存储的。可以通过数据库提供的多种方法来管理数据库。
②数据库的种类:按照早期的数据库理论分为层次数据库、网络式数据库、和关系型数据库。当今互联网最常用的就是关系型数据库和非关系型数据库(NOSQL)。
③关系型数据库:就是一个类似于excel的二维的表格,把复杂的数据结构归结为简单的二元关系。
◆表现形式:关系型数据库中,对数据的操作都是建立在一个或者多个关系表格上。
◆语言处理:关系型数据库是通过结构化查询语言(SQL语言)来进行数据处理,sql语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。通过对这些关联的表格分类、合并、链接、选取等与暗算来实现数据的管理
◆典型产品:MySQL和Oracle,前者08年10亿美金被sun公司收购之后,sun公司又被Oracle收购。
④非关系型数据库:也称为NOSQL数据库,意思是不仅仅是数据库的意思。NOSQL数据库不需要固定的表结构和连接操作,在大数据时代具备关系型数据库无法比拟的性能优势。在WEB2.0的大背景下产生的。
◆表现形式:NOSQL非关系型数据库的出现,能够进行大批量的、高性能的、针对特定场景的、使用便利为目的的功能特意化的数据库产品。目前使用广泛的是键值(Key-Value)存储数据库
◆语言处理:键值(Key-Value)存储数据库就是使用一个哈希表,在数据库中就是一个Key一个值。这种模型的数据库对于IT系统来说,优势在于简单、易部署、高并发。
◆典型产品:Memcached(纯内存)、Redis(持久的支持内存又支持磁盘写入)、memcacheDB、Berkel ley DB。
####提示:当前运维行业,我们需要重点学习和掌握的就是Memcache(纯内存)、Redis(之久的支持内存又支持磁盘)、MemcacheDB。
1.2 常用数据库应用范围
1)Oracle数据库(关系型):Oracle公司是最早开发关系型数据库的厂商之一,支持广泛的操作系统平台。
◆应用范围:传统行业使用广泛,笨重,扩展困难。大公司、征服、金融、证券行业使。
2)MySQL数据库(关系型):SQL语言,定位于中小型关系型数据库,瑞典人开发,默认字符集就是拉丁字符集。体积小,速度快、总体拥有成本低,重要的是开放源代码,网站数据库的主流。
◆应用范围:互联网领域,大中小型网站、游戏公司、电商平台等,百度、阿里、新浪、腾讯均在使用。
3)Memcached(非关系型):Key-value键值形式。开源的、高性能的,纯内存,具有分布式内存对象的缓存系统,国内环境使用的很多。特点就是很快,重启之后数据丢失。为了能够保证数据不再丢失。
◆应用范围:百度等很多大的公司都在使用,构建大负载的网站或者提高访问网站的响应速度,使用范围极为广泛。
#新浪网基于Memcached,开发一个开源项目Memcachedb来适应持久化保存应用场景,后期由持久化产品redis产品来代替实现。
4)redis(非关系型):key-value键值形式和Memcached类似,但支持的存储value类型相对较多。开发一般宁愿选择使用Memcached也不愿使用redis。redis的数据都是还存在内存当中的,区别是redis会周期性的把更新的数据写入磁盘或者把修改的操作写入追加的记录文件。并在此基础上实现主从(master-slave)同步。新浪使用redis比较多一些。
redis特点:支持内存缓存、支持持久化(定时刷新到磁盘上)、数据类型更丰富、支持集群/分布式、支持队列等特殊功能。
◆应用范围:可是使用redis替代Memcached,但是小公司使用Memcached比较多一些。
1.3 Memcache和redis的区别
第一个区别:官方定义的区别:
①版权相同:都是使用的bsd协议,使用它的项目可以用于商业用户,不必发布二次修改的代码,可以修改源代码。
②数据类型:redis数据类型丰富,支持set liset等类型,memcache支持简单数据类型,需要客户端自己处理复制对象。
③持久性:redis支持数据落地持久化存储,memcache不支持数据持久存储。
④分布式存储:redis支持master-slave复制模式,memcache可以使用一致性hash做分布式。
⑤value大小不同:memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用。
⑥数据一致性不同:
redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作。
⑦cpu利用:redis单线程模型只能使用一个cpu,可以开启多个redis进程,Memcache可以使用多核。平均每一个核上 Redis在存储小数据时Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,存储和大数据的性能上Memcached比Redis还是有优势的。两者的使用每秒处理请求的次数都不会成为瓶颈。
第二个区别:redis不同于Memcache之处:
①Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。对数据持久化和数据同步有所要求,那么推荐选择Redis,因为这两个特性Memcached都不具备。Redis在升级或者重启系统后缓存数据不会丢失。
②Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
③Redis支持数据的备份,即master-slave模式的数据备份。
④Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
⑤Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等。
第三个区别:具体应用支持上的不同:
①存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
②数据支持类型:
redis在数据支持上要比memecache多的多。
③使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
④运行环境不同:
redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上。
⑤memcache只能当做缓存,cache。
⑥redis的内容是可以落地的,就是说跟mongodb有些类似,然后redis也可以作为缓存,并且可以设置master-slave。
第二章 MySQL数据库基础知识
2.1 MySQL数据库应用特点
定义:MySQL数据库是一款深受欢迎的开源领域的重要的关系型数据库产品。特点就是将数据保存在不同的表中,再将这些表放入不同的数据库中,如此设计加快MySQL的查询速度,灵活性、可管理性也得到了很大的提高。访问以及管理MySQL数据库以最常用的标准化语为SQL结构化查询语言。
大型的DBA门户,电商平台、匪类门户无一例外在使用MySQL数据库,作为后端的数据库存储。
①性能卓越、服务稳定很少出现异常宕机。
②开放源代码,无版权制约,自主性使用成本低。
③历史悠久,社区及用户活跃,便于问题求助。
④体积小,安装使用简单,易于维护,整体成本低。
⑤品牌口碑效应。LAMP、LNMP流行架构。
⑥支持多种操作系统,提供多种API接口,支持多忠开发语言,特别对于流行的PHP语言有很好的支持。
2.2 生产场景选择数据库版本
①选择开源社区版本的稳定版本GA版本。
②可以选择5.1或者5.5,互联网公司主流5.5其次是5.1和5.6.
③选择GA版本发布后六个月以上的版本。一般不要使用最新版本的,不然出现问题之后不好请教解决。
④选择前后几个月没有大的BUG修复的版本,而不是大量BUG修复集中的版本。
⑤最好选择向后较长时间没有更新发布的版本。
⑥考虑开发人员开发程序使用的版本是否兼容你所选择使用的版本。
⑦内部开发测试数据库环境跑大概3-6个月的时间。没有问题之后,再到生产环境使用。
⑧优先企业非核心业务采用新版本的数据库GA版本。一年左右时间之后在正式上生产环境。
⑨向DBA高手请教,选择好用的GA版本产品。
⑩经过以上程序,没有重要的功能BUG或者性能瓶颈,则可以开始考虑作为任何业务数据服务的后端数据库版本。
###绝大多数的linux操作系统的大中小型互联网网站都在使用MySQL作为后端的数据库存储。
2.3 MySQL的多种安装方法
①rpm包安装,非常简单,安装之后,直接/etc/init.d/mysqld 直接启动。
◆场合:要求不太高,并发不太大,企业内部,小型办公场景。大的门户可能会自制rpm包(把源码根据企业需要自制rpm包,然后yum安装)。
②yum安装,yum install mysql-sever -y,即可。
③常规方式编译安装MySQL.
◆场合:普通运维选择使用,(5.0-5.1版本及以前)。./configure;make;make install。
④采用cmake方式编译安装MySQL.
◆场合:普通运维选择使用,(5.5-5.6版本),cmake;gmake;make;make install;初始化。
⑤采用二进制方式免编译安装MySQL.
◆场合:是专业DBA选择的方式,适合各类MySQL系列。解压,直接初始化。
##建议选择:首先选择5.5及以上的版本,安装机器数量少的话,使用cmake方式编译安装。数量多的话,可以考虑使用二进制方式安装。
2.4 数据库多实例介绍及特点
###概述及用途:
①定义理解:一台机器上开启多个不同的服务端口(如:3306,3307,3308)运行多个MySQL服务进程,而这些服务进程通过不同的socket,监听不同的服务端口,来提供各自的服务。一个端口就是一个多实例,默认端口3306,我们工作中常用3307.3308.3309作为使用端口。
②MySQL多实例,共用一台MySQL安装程序,使用不同或者相同的配置文件my.cnf,启动程序、数据文件、也可使用一样或者不一样的。多实例数据库在提供服务的时候,逻辑上看,是独立的,多个实例的自身是根据配置文件的对应设定值,来取得服务器的相关硬件资源多少。多实例由于共享资源,所以实际上相互之间是有影响的。
③我们接触到的很多服务都可以有多实例,甚至在门户网站用的很广泛,如nginx就可以多实例,apache,haproxy,redis,memcache,都可以多实例。
④作用及问题:单个服务器资源有剩余的时候可以充分利用剩余的资源来提供更多的服务,节约服务器资源,当企业资金紧张时候,但是数据库有需要个字尽量独立提供服务,而且需要主从同步等技术时候,多实例就再好不过了。
⑤资源互相抢占的问题:当某个服务实例并发很高,或者有慢查询的时候,整个实例就会消耗更多的内存/CPU/磁盘IO资源,导致服务器上其他实例提供服务的质量下降。
###门户企业应用场景
①资金紧张公司的选择:当访问量不太大,又资金紧张,但不希望不同业务的数据库服务给尽量独立提供服务而又不受影响,而且需要主从同步等技术提供备份或者读写分离服务时候,多实例就再好不过了。如可以通过3台服务器部署6-9个实例,交叉做主从同步备份及读写分离,这里需要强调,所谓的尽量独立是相对的。
②并发访问不是特别大的业务:当公司访问量不是特别大的时候,服务器资源基本上都是浪费的,这时候适合使用多实例的应用,如果对SQL语言语句优化做的好,MySQL多实例是一个很值得使用的技术,计时并发很大,合理分配好系统资源也不会有太大的问题。
③门户网站应用多实例场景:百度搜索引擎就是多实例,单机4个实例(不同部门有区别),一般是从库,内存96G,内核48核,磁盘STAT15000转,还有ssd、raid5等,4块盘,热插拔,跑3-4实例,sina网也是使用多实例,内存48G,门户网站使用多实例的目的是配硬件好的服务器,节省IDC机柜空间,同时让硬件资源不浪费。
2.5 MySQL多实例基础及配置
①多文件部署方案(本章节主讲方案):通过多个配置文件、多个启动程序、多个数据文件实现多实例方案(老师推荐)。数据文件、启动文件、配置文件分别是独立的。大目录是data,然后端口作为小目录作为多实例。
②单一配置文件部署方案(mysql手册第5章节)。启动方法使用一条命令(mysql_multi)进行启动。缺点是耦合度太高。
③本章节的多实例首先要安装依赖:
yum install ncurses-devel -y
yum install libaio-devel -y
④具体推荐camake安装5.5,其他也可使用二进制安装方式为例。
⑤工作场景:生产配置为MEM32g,双CPU,8核,磁盘6*600g sas 15000转,我们一般配置2-3个实例。
⑥多实例的配置文件中除了端口号不一样,server id也是不一样的。
⑦多实例的启动文件的启动停止实质:
多实例启动文件的启动mysql服务实质:
mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 > /dev/null &
mysqld_safe --defaults-file=/data/3307/my.cnf 2>&1 > /dev/null &
多实例启动我跟见的停止mysql服务实质:(平滑停止数据库)
mysqladmin -u root -p123456 -S /data/3306/mysql.sock shutdown
mysqladmin -u root -p123456 -S /data/3306/mysql.sock shutdown
第三章 编译安装MySQL步骤及管理命令
3.1 MySQL编译安装步骤
##编译安装:编译安装MySQL5.5步骤:
①下载cmake、MySQL软件到安装包到指定存放目录。解压cmake安装包。
②查看系统环境。
③安装相关的依赖包yum -y install ncurses-devel 。并创建mysql用户和用户组。
④编译参数./configure。完之后之后使用gmake和gmake install执行继续执行。完毕后返回目录。
⑤解压数据库软件并且安装编译参数指定进行编译并进行make && make install。
⑥创建硬链接、拷贝最小化模版、配置环境变量。
⑦两个授权之后,进行初始化。之后拷贝启动文件到/etc/init.d/mysqld,并授权。
⑧启动mysql并查看端口,然后登录mysql。
⑨删除mysql用户及测试库test,增加数据库mysql密码。设置开机启动。
⑩排错以及修改字符集问题。推荐使用字符集:LANG="zh_CN.UTF-8"
##命令总结:
#1、解压编译cmake软件 cd /oldboy/tools tar xf cmake-2.8.8.tar.gz cd cmake-2.8.8 ./configure gmake gmake install cd ../ #2、安装相关依赖包 yum install ncurses ncurses-devel -y yum install libaio-devel -y #3、创建mysql用户及用户组 groupadd mysql useradd mysql -s /sbin/nologin -M -g mysql #4、解压编译mysql tar xf mysql-5.5.32.tar.gz cd mysql-5.5.32 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 -DMYSQL_DATADIR=/application/mysql-5.5.32/data -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0 make && make install #5、创建硬链接以及设置mysql的环境变量 ln -s /application/mysql-5.5.32 /application/mysql echo ‘export PATH=/application/mysql/bin:$PATH‘ >>/etc/profile tail -1 /etc/profile source /etc/profile echo $PATH #6、创建mysql启动配置文件 cp /application/tools/mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf chown -R mysql.mysql /application/mysql/data Chmod -R 1777 /tmp/ #7、进行mysql初始化(两个OK) cd /application/mysql/scripts/ ./mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql ##如果有警告说主机名解析不了,那么可以把主机名加入到/etc/hosts中。 #8、mysql的基本相关设置 #修改server文件的内容(路径) #basedir=/application/mysql #datadir=/application/mysql/data cp /application/tools/mysql-5.5.32/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld /etc/init.d/mysqld start mysqladmin -uroot password ‘123456‘ mysql -uroot -p123456 select user,host from mysql.user; delete from mysql.user where user=‘‘;
3.2 MySQL基础管理操作命令
①单实例数据库mysql的启动命令:/etc/init.d/mysqld start。出现故障的时候使用mysql_safe --user=mysql来进行启动。就是把安装包里面的mysql.server脚本拷贝的。(shell脚本)。
②检查端口:ss -lntup|grep 330或者使用netstat -lntup|grep 330.
③检查进程:ps -ef|grep mysql|grep -v grep 两个主要的进程,一个就是mysql_safe一个是mysqld。
④mysql启动的基本原理:/etc/init.d/mysqld start是一个shell的启动脚本,启动后会最终调用mysqld_safe脚本,最后调用mysqld服务器启动mysql。文件vim /application/mysql/support-files/mysql.server 中的$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
⑤初始化时候启动方法:mysql_safe --user=mysql &,当找回root密码的时候用此方法启动,和/etc/init.d/mysqld 的启动实质是一样的。
⑥常用关闭mysql命令:/etc/init.d/mysqld stop 然后查看端口是否关闭。
⑦mysql关闭的原理:在脚本文件/etc/init.d/mysqld文件中内容有两个地方需要注意:if (kill -0 $mysqld_pid 2>/dev/null)还有一个地方就是kill $mysqld_pid。
⑧强制关闭数据库方法:
killall mysqld
pkill mysqld
killall -9 mysqld
⑨优雅关闭数据库方法:
第一种:mysqladmin方法:mysqladmin -uroot -p123456 shutdown
##${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
第二种:自带脚本方法:/etc/init.d/mysqld stop
第三种:kill 信号方法:kill -USR2 ‘cat path/pid’(最好不要使用)
##mysql登陆之后管理操作:
一、连接MYSQL。
登录:mysql -h主机地址 -u用户名 -p用户密码
##删除用户及库: select user,host from mysql.user; delete from mysql.user where user=‘’ host=‘’; drop database test; ##删除test库,用户只留下root 127.0.0.1和root localhost delete from mysql.user; grant all privieges on *.* to [email protected]‘localhost‘ identified by ‘密码‘ with grant option; 退出:MYSQL命令: exit (回车) ##删除多于账号语法drop user “user”@“主机域” ##注意可以是单引号或者双引号,但是不能不加。 ##注意如果有时候使用drop删除不掉,那么使用delete进行删除。 delete from mysql.user where user=‘root’ and host=‘oldboy’ flush privileges
二、密码设置
1、增加密码
/application/mysql/bin/mysqladmin -u root password ‘密码‘
2、修改密码
格式:mysqladmin -u用户名 -p旧密码 password 新密码
mysqladmin -uroot -p旧密码 -password 新密码
三、增加新用户。
基本格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
1、例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to [email protected]"%" Identified by "abc";
但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。
2、例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to [email protected] identified by "abc";
如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to [email protected] identified by "";
##可以授权的权限:
1 SELECT(查询) 2 UPDATE(更新) 3 INSERT(插入) 4 DELETE(删除) 5 CREATE (创建库表) 6 DROP (删除库表) 7 REFERENCES 8 INDEX (索引) 9 ALTER (修改) 10 CREATE TEMPORARY TABLES (创建临时表) 11 LOCK TABLES (锁表) 12 EXECUTE (执行) 13 CREATE (VIEW 创建视图) 14 SHOW VIEW (显示视图) 15 CREATE ROUTINE (创建存储过程) 16 ALTER ROUTINE (修改存储过程) 17 EVENT (事件) 18 TRIGGER (触发器) ###企业生产环境MySQL如何授权: ##博客,CMS等产品的数据库授权: #①web连接用户授权采用最小化授权,很多开源软件都是web界面安装的,所以在安装期间,除了select、insert、update,delete四个权限(增删改查)之外,还要有create、drop等比较危险的授权。 grant select,insert,update,delete,create,drop on blog.* to ‘blog‘@‘192.168.109.%‘ identified by ‘123456‘; ##常规情况下只授权4个基本权限即可。在安装完毕之后将create和drop权限收回,让他只能增删改查。 REVOKE INSERT ON *.* FROM ‘jeffrey‘@‘localhost‘; REVOKE create ON blog.* FROM ‘blog‘@‘10.0.0.%‘; REVOKE drop ON blog.* FROM ‘blog‘@‘10.0.0.%‘; ##现在的bbs数据库,可能还不能收回这两个权限,因为缓存表我们需要清空的。收回权限之后,可能就需要后台去删除缓存表。所以一定要评估企业中的权限到底需要那些。 ##注意主从数据库的授权可能不一样。(主库从库复制,可能写从主库,读从从库,读写分离。) #②查看用户授权: [[email protected] ~]# /data/3308/mysql start Starting MySQL... [[email protected] ~]# mysql -uroot -p123456 -S /data/3308/mysql.sock mysql> show grants for ‘oldboy‘@‘localhost‘; +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for [email protected] | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO ‘oldboy‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515‘ | | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test`.* TO ‘oldboy‘@‘localhost‘ | +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
四、显示命令
1、显示数据库列表。
show databases;
select database(); 查看当前库中内容
刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示库中的数据表:
use mysql;
show tables;
select user(); 查看当前表中内容
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名 (字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
9、字符集相关:
show create database 库名\G
mysql -uroot -p123456 -e “show character set;” #查看当前数据库MySQL系统支持的字符集。
mysql -uroot -p123456 -S /data/3308/mysql.sock --default-character-set=latinl #带字符集命令行登陆多实例数据库
create database oldboy;默认数据库的字符集为拉丁字符集。
create database oldboy_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; gbk字符集
create database oldboy_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;utf8字符集
10、show grants for [email protected]; #查看某一个用户权限信息
11、排序问题:
###升序排表:mysql> select user,host,password from mysql.user order by user asc;
###倒序排表:mysql> select user,host,password from mysql.user order by user desc;
3.3 密码问题设置相关
①mysql数据库默认的管理员密码为空,很不安全的。
简单安全措施:为root设置密码、删除无用的mysql库内用户账号,删除默认存在的test数据库。
②更严格的数据库安全设置:
1)删除所有的mysql中的用户,包括root超级用户。
mysql> delete form mysql.suer; 后做
2)增加system用户并提升为超级管理员,即和root等阶的用户,知识名字不一样。(思路先后流程:先建立再删除,不然先删除之后挡在外面就完蛋了。)
mysql> grant all privileges on *.* to [email protected]‘localhost‘identified by ‘123456‘ with grant option; 先做
③为管理员root用户设置密码的方法:
1)单实例,没有密码的用户设置密码 mysqladmin -u root password ‘123456’
2)多实例,mysqladmin -u root -p ‘123456’ password ‘tslove123456’-S /data/3306/mysql.sock
④修改管理员root密码法一:(命令行外修改)
mysqladmin -u root password ‘123456’ password ‘new passwd’
mysqladmin -u root -p ‘123456’ password ‘tslove123456’-S /data/3306/mysql.sock
⑤修改管理员root密码法二:使用sql语句修改。
mysql> select user,host from mysql.user; +------+-----------+ | user | host | +------+-----------+ | root | 127.0.0.1 | | root | MySQL-M | | root | localhost | +------+-----------+ 3 rows in set (0.00 sec) mysql> desc mysql.user | Password | char(41) (找到密码字段) mysql> select user,host,password from mysql.user; +------+-----------+-------------------------------------------+ | user | host | password | +------+-----------+-------------------------------------------+ | root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | root | MySQL-M | | | root | 127.0.0.1 | | +------+-----------+-------------------------------------------+ 3 rows in set (0.00 sec) mysql> update mysql.user set password=‘123456‘ where user=‘root‘ and host=‘localhost‘; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select user,host,password from mysql.user; +------+-----------+----------+ | user | host | password | +------+-----------+----------+ | root | localhost | 123456 | | root | MySQL-M | | | root | 127.0.0.1 | | +------+-----------+----------+ 3 rows in set (0.00 sec) ###以上修改成明文的数据库密码之后,单实例登录可能会遇到问题,多实例登录无异常。 ##注意加上条件where,和密码函数,不然可能会修改全部的mysql用户密码。 ##将修改的密码加密显示如下: mysql> update mysql.user set password=password(123456) where user=‘root‘ and host=‘localhost‘; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select user,host,password from mysql.user; +------+-----------+-------------------------------------------+ | user | host | password | +------+-----------+-------------------------------------------+ | root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | root | MySQL-M | | | root | 127.0.0.1 | | +------+-----------+-------------------------------------------+ 3 rows in set (0.04 sec) mysql> flush privileges; 【刷新到文件中(没刷新的时候在内存中)】 Query OK, 0 rows affected (0.00 sec) ###命令 update mysql.user set password=password(456) where user=‘root‘ and host=‘localhost‘; ##这种修改密码的方法适合于root密码丢失找不回来的情况下使用。 ##另外直接set来修改当前登陆用户密码:(不适合密码丢失找不回来情况下的解决) mysql> set password=password(‘123456‘); ##不管什么情况下修改密码都要刷新操作flush privileges; ##生产环境密码的设置应该是8位数的并且有字母数字的混合。 ##1、必须指定条件 ##2、必须指定passwrord()密码函数来加密更改密码。 ##3、所以一般我们不实用sql语言和set来修改密码。 ##4、所以我们一般使用mysqladmin 和update来修改密码。最常用的就死mysqladmin。 ⑥找回丢失的mysql密码 单实例:首先停止mysql,然后使用--skip-grant-tables启动mysql,忽略授权登陆验证。 [[email protected] ~]# ss -lntup|grep mysql tcp LISTEN 0 128 *:3307 *:* users:(("mysqld",56075,11)) tcp LISTEN 0 128 *:3308 *:* users:(("mysqld",57957,12)) tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",56816,12)) [[email protected] ~]# /data/3306/mysql stop Stoping MySQL... [[email protected] ~]# /data/3307/mysql stop Stoping MySQL... [[email protected] ~]# /data/3308/mysql stop Stoping MySQL... [[email protected] ~]# ss -lntup|grep mysql ####单实例忽略授权表登录mysql_safe --skip-grant-tables --user=mysql mysqld_safe --skip-grant-tables --user=mysql & #然后直接mysql进入数据库 #此时不能使用mysqladmin来修改密码,mysqladmin修改密码必须要有原来的密码。 #使用updata修改密码(注意使用双引号将密码括起来),刷新权限。 #如此更改密码之后需要重新启动mysql,否则还是忽略授权表。 #没有使用/etc/init.d/mysqld启动,所以此时也不能是命令停止mysal(pid文件相关)。 #此时使用mysqladmin -uroot -p(update修改后的密码)shutdown 来停止数据库mysql。之后再用正常的方式启动mysql。 ##注意使用shutdown停止数据库之后,重启数据库,否则别的数据库使用者用户登录受到影响。 ####多实例(指定配置文件): #启动和关闭:使用killall mysql,关闭mysql。 #启动时候使用 mysql_safe --defaults-file=/data/3306/my.cnf --skip—grant-tabes mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table mysql -u root -p -S /data/3306/mysql.sock <==登陆时空密码。
3.4 MySQL编译安装参数参考
create database oldboy;默认数据库的字符集为拉丁字符集。 ##字符集不一致,是数据库中文内容乱码的罪魁祸首。 ##以上是在编译数据库的时候没有指定默认字符集的情况。如果编译的时候指定了字符集,那么以后创建数据库的时候就不需要再指定字符集和校对规则。 编译时候指定字符集 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci ##全部的编译参数如下: tar zxf mysql-5.5.32.tar.gz cd mysql-5.5.32 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 -DMYSQL_DATADIR=/application/mysql-5.5.32/data -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii -DENABLED_LOCAL_INFILE=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_FAST_MUTEXES=1 -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_DEBUG=0
3.5 增删改差记录(待补充)
①
②
③
④
⑤