MySQL-基础部分

数据库

文章目录

  • 数据库
    • 1. MySQL数据库介绍
    • 2.MySQL数据库的安装
      • 1. 安装MySQL
      • 2. 编译安装MySQL
    • 3. MySQL架构
    • 4. SQL语句
      • 1. 类型
      • 2. DDL数据库定义语句
        • 1. 三种sql_mode模式
        • 2. 字符串类型
        • 3. 日期时间类型
          • 1. date类型
          • 2. time类型
          • 3. year类型
          • 4. datetime和timestamp类型
        • 3. ENUM和SET类型
        • 4. 修饰符(约束)
        • 5. 索引建立
        • 6. PRIMARY KEY
        • 7. 全文本索引
      • 3.DML 数据库操作语句
        • 1. 三种操作
          • 1. insert
          • 2. update
          • 3. delete
        • 2. sql语句使用
          • 1. select查询语句
          • 2. 修改root帐号
        • 3. 排序检索语句
    • 5. MySQL引擎
        • 1. 查看MySQL引擎
        • 2. 使用不同引擎创建表进行对比
        • 3. mysql视图
          • 1. 单表视图
          • 2. 多表视图
          • 3. 多表查询
        • 4. 存储引擎是什么?
          • 1. MyISAM
        • 5.INOODB引擎
            • 1. 外键索引
            • 2. 建立外键
            • 3. 表级锁和行级锁
            • 4. 事务的支持
          • 2. mrg_myisam实验
    • 6. 用户权限和访问控制
      • 1. 创建用户并设置密码
      • 2. root密码丢失
        • 1. 修改密码安全策略
      • 3. 查询用户权限
        • 1. 连接测试
        • 2. 权限
        • 3. 授权grant
        • 4. 移除权限revoke
        • 5. 远程主机授权
    • 7. 备份恢复
      • 1. 备份
        • 1. 物理备份
        • 2. 物理备份
        • 3. 物理在线备份 myisam
        • 4. 练习
        • 5. 实验过程
          • 1. 使用rpm源码安装的数据库
          • 2. 使用yum安装的数据库
      • 2. 导入导出
      • 3. lvm的快照(mysql备份)
      • 4. 二进制日志的使用log-bin
        • 1. 启用方法
        • 2.binlog日志的模式
        • 3. 数据库全备实验
          • 1. 数据库全备
          • 2. 实验环境
          • 3. 练习
        • 4. binlog日志的使用
          • 1.开启binlog日志
        • 5. 模拟恢复
          • 1. 物理删除
            • 1.完全备份做好
            • 2. 开启binglog日志
            • 3. 模拟错误
            • 4. 恢复
          • 2. 逻辑删除
            • 1.完全备份做好
            • 2.开启binglog日志
            • 3. 完全恢复
    • 8. MySQLAB复制
      • 1. MySQLAB复制
        • 1. MySQLAB复制简介
        • 2. 主从复制的基本过程
          • 1. 主服务器
          • 2. 从服务器
      • 2. M-M互为主从
      • 3. Keepalived+MySQL互主
      • 4. MySQL AB复制的半同步
        • 1. 半同步复制
        • 2. 异步与半同步异同
        • 3. 配置(先做AB异步复制,再改成半同步)
        • 4. 查询状态
        • 5. 测试
      • 5. GTID复制
        • 1. GTID概念介绍
        • 2. GTID的组成
        • 3. GTID的工作原理
        • 4. 相关配置
    • 9.多源复制
      • 1. 使用多源复制的考虑
      • 2. 实验环境
    • 10. MyCat
      • 1. MyCat实现读写分离
        • 一、下载mycat
        • 二、安装JDK并且配置环境变量
        • 三、修改mycat配置文件
          • (一)先配置server.xml
          • (二)接下来配置schema.xml
          • (三)配置文件解释
          • (四)心跳检查语句
          • (五)配置两台读写服务器
        • 四、启动mycat
          • 1. 测试
            • 1. 使用test用户
            • 2. 使用user用户
      • 2. MyCat垂直切分
      • 3. MyCat水平切分
      • 4. 实验
    • 11. MySQL Cluster
      • 1. Cluster Configuration
    • 12. MySQL应用
      • 1. LAMP架构
      • 2. MySQL和FTP实现虚拟用户

1. MySQL数据库介绍

1. 什么是数据?
数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素

材。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离

的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响时才成为信

息。数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数

据。在计算机系统中,数据以二进制信息单元0,1的形式表示。

数据存储的发展史:

2. 什么是数据库

数据库(Database):是按照[数据结构]来组织、存储和管理数据的仓库

关系型数据库:SqlServer Oracle mysql db2

非关系型数据库:mongdb Hbase Cassandr

3. 什么是数据库管理系统(DBMS)?

数据库管理系统:是由数据库及其管理软件组成的系统

1.提供数据持久性的存储,备份,恢复

2.支持事务管理

3.数据操作的并发

4.支持独立的管理语言(sql语句)

4. 使用数据库的优势:

1.数据的独立性:
元数据的存储,应用程序程序不需数据的格式问题

2.数据的冗余:
最小化数据冗余,保障数据的统一性和一致性

3.数据的安全:
不同的用户可以看到独立的数据

4.数据的利用率:
使用结构化的数据管理语言(sql语句)

5.简单的数据备份和恢复:
提供多种数据备份恢复方式,使数据的安全性更高

5. 数据库分类:

1.关系型数据库(MySQL,Oracle,db2,SQL server)

2.非关系型数据库(MongoDB Hbase Cassandra)

6. 什么是关系型数据库
关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”。现如今虽然对此模型有一些批评意见,但它还是数据存储的传统标准。标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

MySQL-基础部分_第1张图片

MySQL-基础部分_第2张图片

7. mysql数据库的发展史(该文章来自于互联网)

​ MySQL的历史最早可以追溯到1979年,有一个人叫Monty Widenius, 为一个叫TcX的小公司打工,并用BASIC设计了一个报表工具,可以在4M主频和16KB内在的计算机上运行。过了不久,又将此工具,使用C语言重写,移植到Unix平台,当时,它只是一个很底层的面向报表的存储引擎.

​ 1985 年,瑞典的几位志同道合小伙子(以David Axmark 为首) 成立了一家公司,这就是MySQL AB 的前身。这个公司最初并不是为了开发数据库产品,而是在实现他们想法的过程中,需要一个数据库。他们希望能够使用开源的产品。但在当时并没有一个合适的选择,没办法,那就自己开发吧。

​ 在最初,他们只是自己设计了一个利用索引顺序存取数据的方法,也就是I S A M(Indexed Sequential Access Method)存储引擎核心算法的前身,利用ISAM 结合mSQL 来实现他们的应用需求。在早期,他们主要是为瑞典的一些大型零售商提供数据仓库服务。在系统使用过程中,随着数据量越来越大,系统复杂度越来越高,ISAM 和mSQL 的组合逐渐不堪重负。在分析性能瓶颈之后,他们发现问题出在mSQL 上面。不得已,他们抛弃了mSQL,重新开发了一套功能类似的数据存储引擎,这就是ISAM 存储引擎。大家可能已经注意到他们当时的主要客户是数据仓库,应该也容易理解为什么直至现在,MySQL 最擅长的是查询性能,而不是事务处理(需要借助第三方存储引擎)。

1990年,TcX的customer 中开始有人要求要为它的API提供SQL支持,当时,有人想到了直接使用商用数据库算了,但是Monty觉得商用数据库的速度难令人满意。于是,他直接借助于mSQL的代码,将它集成到自己的存储引擎中。但不巧的是,效果并不太好。于是,Monty雄心大起,决心自己重写一个SQL支持。

​ 1996年,MySQL 1.0发布, 在小范围内使用。到了96年10月,MySQL 3.11.1发布了,没有2.x版本。最开始,只提供了Solaris下的二进制版本。一个月后,Linux版本出现了。 此时的MySQL还非常简陋,除了在一个表上做一些Insert,Update,Delete和Select 操作职位,没有其他更多的功能。

紧接下来的两年里,MySQL依次移植到各个平台下。它发布时,采用的许可策略,有些与众不同:允许免费商用,但是不能将MySQL与自己的产品绑定在一起发布。如果想一起发布,就必须使用特殊许可,意味着要花银子。当然,商业支持也是需要花银子的。其它的,随用户怎么用都可以。这种特殊许可为MySQL带来了一些收入,从而为它的持续发展打下了良好的基础。

1999-2000年,有一家公司在瑞典成立了,叫MySQL AB。 雇了几个人,与Sleepycat合作,开发出了 Berkeley DB引擎, 因为BDB支持事务处理,所以,MySQL从此开始支持事务处理了。

在2000 年的时候,MySQL 公布了自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。

2000年4月,MySQL对旧的存储引擎进行了整理,命名为MyISAM。

2001年,Heikiki Tuuri向MySQL提出建议,希望能集成他们的存储引擎InnoDB,这个引擎同样支持事务处理,还支持行级锁。所以在2001年发布的3.23 版本的时候,该版本已经支持大多数的基本的SQL 操作,而且还集成了MyISAM和InnoDB 存储引擎。MySQL与InnoDB的正式结合版本是4.0。

2004年10月,发布了经典的4.1版本。 2005年10月,有发布了里程碑的一个版本,MySQL 5.0. 在5.0中加入了游标,存储过程,触发器,视图和事务的支持。在5.0 之后的版本里,MySQL明确地表现出迈向高性能数据库的发展步伐。

2008年1月16号 MySQL被Sun公司收购。

2009年04月20日Oracle收购Sun 公司,MySQL 转入Oracle 门下。

2010年04月22 发布MySQL 5.5, MySQLcluster 7.1.

现在官网可以下到的MySQL 版本是:5.5.18. Oracle 对MySQL版本重新进行了划分,分成了社区版和企业版,企业版是需要收费的,当然收费的就会提供更多的功能。

2.MySQL数据库的安装

1. 安装MySQL

下载的mysql的安装包就是MySQL-5.6.22-1.el6.x86_64.rpm-bundle.tar。可以使用file命令来查看一下这个文件,它是一个tar的软件包,所以说我们需要先将这个tar包解开,再运行里面的rpm包,

[root@7-1 mysql]# mkdir /var/mysql
[root@7-1 mysql]# tar -xjvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /var/mysql/
bzip2: (stdin) is not a bzip2 file.
tar: Child returned status 2
tar: Error is not recoverable: exiting now
[root@7-1 mysql]# tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /var/mysql/
mysql-community-embedded-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-test-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm
[root@7-1 mysql]# cd /var/mysql/
[root@7-1 mysql]# ls
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm
mysql-community-test-5.7.28-1.el7.x86_64.rpm

​ 可以看到得到了很多的rpm包,这里面常用的包有MySQL-client-5.6.22-1.el6.x86_64.rpm和mMySQL-

server-5.6.22-1.el6.x86_64.rpm,如果仅仅是想安装一个MySQL的服务器使用的话,安装这两个包其实就足够

了,它包含了mysql的服务器端和客户端软件。有些时候还需要MySQL-devel软件包,这个包也常安装,它里面

包含了MySQL的库文件以及头文件,有些时候安装一些其他的软件需要调用到这些MySQL的库文件和头文件

的时候就安MySQL-devel包,比方说安装MySQL proxy代理服务器,或者是mysql enterprise monitor监控软

件可能都需要安mysql-devel软件包,下面来安装这些软件包。安装方式可以采用两种:

一种是rpm命令一个个安装,在安装过程中可能会遇到依赖性问题,需要手工去解决。


[root@zyg tmp]# rpm -ivh MySQL-client-5.6.22-1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:MySQL-client           ########################################### [100%]

另外一个方式是使用yum命令的方式。

[root@node1 tmp]# yum install MySQL-server-5.6.22-1.el6.x86_64.rpm 

此种方法若是虚拟机中存在相关rpm包,可以直接yum -y install 指定路径下的包名 安装即可。
[root@7-1 ~]# yum -y install /var/mysql/mysql-comminty-*

安装完毕之后,屏幕上打印出了很多的内容,注意下面这句话:


A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
You will find that password in '/root/.mysql_secret'.

​ 一个随机性的密码已经为mysql的root 用户设置好了,你可以在root家目录下的.msyql_secret中看到这个

密码,这个是mysql 5.5版本之后新出现的一个特性,mysql 5.5之前的版本在安装完之后,有一个非常重要的

安全性隐患就是mysql 管理用户和mysql root用户是空密码,所以对于一个刚刚安装完成之后的mysql服务器

来说,任何人可以从任何地方使用空密码直接访问数据库,这是一个很不安全的事情,因此在5.5.以后在

mysql安装完之后会随机性的为root用户随机设置一个密码并且把它保存在root家目录下的.msyql_secret文件中


You must change that password on your first connect,
no other statement but 'SET PASSWORD' will be accepted.
See the manual for the semantics of the 'password expired' flag.

你必须在你第一次连接mysql的时候重设这个密码。别的都干不了,但是’SET PASSWORD这个命令是可以执行的,可以去看相应的手册,比如 password expired部分的介绍


Also, the account for the anonymous user has been removed.

In addition, you can run:

  /usr/bin/mysql_secure_installation

which will also give you the option of removing the test database.
This is strongly recommended for production servers.

See the manual for more instructions.

这里提到了一个工具叫做mysql_secure_installation叫安全的安装,这个安装其实提供了几个功能,让我们在初次安装MySQL之后呢,提供一些安装上面的修改,建议大家在安装完毕之后使用,后面还有一些介绍,可以去mysql官方网站去看它的手册,还可以去shop.mysql.com买它的商品,等等。


Please report any problems at http://bugs.mysql.com/

The latest information about MySQL is available on the web at

  http://www.mysql.com

Support MySQL by buying support/licenses at http://shop.mysql.com

New default config file was created as /usr/my.cnf and
will be used by default by the server when you start it.
You may edit this file to change server settings




首先想要去操作mysql的时候,需要知道它给我们设置的随机密码是什么。我们来看一下
[root@zyg tmp]# cd

[root@zyg ~]# ls .mysql_secret 
.mysql_secret

[root@zyg ~]# cat .mysql_secret
\# The random password set for the root user at Mon Dec  8 01:47:25 2014 (local time): T9YV_AZe_HIZoQ5z

.mysql_secret这个文件里面写了随机性的密码。要连接mysql,就需要把这些随机密码输入进去。

不过先不着急,先运行一下mysql_secure_installation这个命令,建议在第一次安装完成之后先运行这个命令,如果你没有运行mysql的话,当然无法对它进行一些安装方面的设置和操作。先把mysql这个服务启动起来。


[root@zyg ~]# service mysql start
Starting MySQL.                                            [  OK  ]

​ 这里介绍一下,在mysql5.1版本之后,官方所发布的mysql的安装包服务名称就发生了变化,以前叫做

mysqld,现在叫做mysql。另外需要注意一点的是,rhel发行版本的光盘中带的mysql它的服务名称仍然是

mysqld,所以这个名字不要忘记,官方下的这个MySQL包叫做mysql,如果redhat发行的光盘当中叫做

mysqld,我们可以使用service mysqld start 来启动mysql,或者也可以使用 /etc/init.d/mysqld start 通过脚

本启动它。这两条命令作用是一样的。

​ 现在再来执行mysql_secure_installation,接下来输入.mysql_secret中的密码。输入密码之后它会问是否

修改密码,可以将密码修改为一个容易记忆的,符合密码复杂性要求的密码,比方说至少八位以上数字大小写

字母特殊符号都有等等的要求。


[root@zyg ~]# mysql_secure_installation 



NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


​ 接下来它继续问你,mysql在安装完毕之后,它默认会创建一个匿名用户,这个匿名用户是用来进行mysql

测试时使用的,这个匿名用户它允许任何人从任何地方登陆到mysql,但是不能干其他的一些事情,这个也是

一个安全隐患,所以它会问你是否要移出匿名用户,选择yes移除,


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!


​ 接下来,root是只允许从本地登录mysql的,所以在这里它给你提供了一个选项,是否禁止root用户从远程

的机器上登录到这台mysql,这个设置一般来说在生产环境当中应该选择的是yes,也就是关闭。因为在生产

环境当中往往注重mysql的安全性,所以对于mysql管理用户的登录是限制的非常严格的,如果你需要用root

用户来登录mysql的话,往往先是ssh远程连接的方式,先登录到具体的服务器上,然后在这台服务器的本地

使用root用户来登录。当然对于其它一些要求不严格的情况下,是允许root用户远程登录的,所以说这个选项

是否选择,要看具体公司的安全要求,来针对性选择。这里选择n,允许root用户远程登录。


Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n
 ... Success!

​ 接下来,默认情况下mysql在安装的时候会创建一个叫做test的库,这个库任何人都可以进行访问,这个库

的用途是用于测试的,所以说问你是否要移除test数据库,y移除


By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 \- Dropping test database...
 ... Success!
 \- Removing privileges on test database...
 ... Success!
 

​ 接下来是否重读一下授权表,这样可以对mysql相应的授权,刚才所发生的一些修改,保证它立即生效,

yes。这样一来的可以安全放心的使用mysql了。


Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!




All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!


Cleaning up...


需要注意的地方

当使用源码进行安装的时候,密码是需要使用命令进行初始化查看的
[root@localhost mysql]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data 

而使用yum安装方式安装的。则只需要查看配置文件的信息即可
[root@7-1 ~]# yum -y install /var/mysql/mysql-*
[root@7-1 ~]# cat /var/log/mysql.log | grep pass 

接下来介绍mysql客户端的一些使用,客户端的使用分为两种:

客户端使用
· 交互式
· 非交互式

最为常用的往往是交互式,而非交互式往往在某一些特殊需要下才进行使用。

首先来看,最为基本的客户端就是mysql这个命令了。

范例一:mysql -h 192.168.0.1 -P 3306 -uroot -p123 [dbname]
范例二:mysql -e “create database power”

mysql命令后面可以跟上很多相应的参数,不同的参数起到不同的作用,看一下这些参数的使用。

常见参数		解释
\----------------------------------
-u		指定登录用户名
-p		指定登录密码
-h		指定数据库主机地址
-P		指定登录端口
dbname		指定操作数据库
-e		使用非交互式操作

-P 指定登录msyql服务器的端口,默认端口是3306,如果在设置服务器的时候将服务器的端口改成别的了,

在这里可以指定别的端口号,比方说3300。

-p 如果为-u指定的用户设置了密码,那么-p就必须指定,如果没有为用户设置密码,这个用户是空密码,一般

来说是不会这么做的,假设说没有密码,不指定-p 也可以,直接就可以登录。

注意

-p之后如果要写密码的话,一定要紧跟着-p之后写密码-ppasswd,一旦-p后面发生了空格的话,它就会认为

这个密码,并不像在命令行当中输入,而是在enter之后提供给一个密码提示符后面输入密码进行登录,而空

格之后的字符,它就会认为是要操作的数据库的名称,因此有没有空格区别很大,这一点一定要注意,前面这

些参数可以没有空格,前面的参数是无所谓的,有没有空格都可以,但是一定要注意到特别是这个-p,-p后面

的空格就变得非常敏感了,所以一般来说将-p参数放到最后来写。方便写完密码之后,写数据库。


[root@zyg ~]# mysql -h localhost -u root -p123 
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.6.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

​ 现在要登录到本机的数据库上,假如说直接使用数据库的管理员用户root用户,其实这样一来参数就会大大

的简化,因为一些可选性的参数就可以不写了,可以直接写mysql -p就可以了,-h不写默认就是本机,所以说

可以省略的,-u参数不写默认使用root用户登录,也可省略,-P不写默认使用端口3306,数据库端口没有改

过,默认就是3306,所以说这个也可以不写,-p一定要写,因为给root用户设置过密码,数据库名称也可以

不写,可以进入数据库之后再去指定,所以最简化的方式就是mysql -p,-p后面也不跟密码直接enter,会看

到在下一行当中它会提示你输入密码,可以再这里输入密码,而且在这里输入密码还有一个好处,密码并不会

直接显示在终端上。这样更加安全一些。enter之后你会看到mysql的欢迎信息,并且提示符会变成mysql跟着

一个>大于符号,这就代表登录成功了,就连接到了mysql的数据库里面。


[root@zyg ~]# mysql -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.6.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

 

2. 编译安装MySQL

MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,在安装源文件中找不到configure文件是正常的。

以下的安装方式属于使用源码包进行安装的


[root@zyg tmp]# tar xf cmake-3.1.0-rc2.tar.gz 
[root@zyg tmp]# cd cmake-3.1.0-rc2
[root@zyg cmake-3.1.0-rc2]# ./configure 
[root@zyg cmake-3.1.0-rc2]# gmake
[root@zyg cmake-3.1.0-rc2]# make install


下表列出了常用编译工具的调用语法和等效的CMake命令。“.”表示当前的工作目录路径,请根据所在的目录,适当的替换掉路径“.”。


configure命令		CMake命令
\-------------------------------------------------------
./configure		cmake .
./configure --help	cmake . -LH or ccmake .


在重新配置或重新构建之前,需要先清除旧的对象文件和缓存信息:

make clean 
rm CMakeCache.txt

1. 安装参数选项

在下表中,“CMAKE_INSTALL_PREFIX”的值表示的是安装根目录,其他参数值的路径都是相对于根目录的,当然也可以直接使用绝对路径:

参数值说明		配置选项						CMak选项
\-------------------------------------------------------------------------------------------------------------------
安装根目录		--prefix=/usr					-DCMAKE_INSTALL_PREFIX=/usr
mysqld目录		--libexecdir=/usr/sbin				-DINSTALL_SBINDIR=sbin
数据存储目录		--localstatedir=/var/lib/mysql			-DMYSQL_DATADIR=/var/lib/mysql
配置文件(my.cnf)目录	--sysconfdir=/etc/mysql				-DSYSCONFDIR=/etc/mysql
插件目录		--with-plugindir=/usr/lib64/mysql/plugin
-DINSTALL_PLUGINDIR=lib64/mysql/plugin
手册文件目录		--mandir=/usr/share/man				-DINSTALL_MANDIR=share/man
共享数据目录		--sharedstatedir=/usr/share/mysql		-DINSTALL_SHAREDIR=share
Library库目录		--libdir=/usr/lib64/mysql			-DINSTALL_LIBDIR=lib64/mysql
Header安装目录		--includedir=/usr/include/mysql	-DINSTALL_INCLUDEDIR=include/mysql
信息文档目录		--infodir=/usr/share/info			-DINSTALL_INFODIR=share/info


存储引擎选项

存储引擎是以插件的形式存在的,所以,该选项可以控制插件的构建,比如指定使用某个特定的引擎。

–with-plugins配置选项接受两种形式的参数值,它没有对应的CMake配置参数:

① 以逗号(,)分隔的引擎名称列表;

② a “group name” value that is shorthand for a set of engines

在CMake中,引擎被作为单个的选项来进行控制。假设有以下配置选项:

--with-plugins=csv,myisam,myisammrg,heap,innobase,archive,blackhole  

上面的参数指定MySQL数据库可以支持哪些数据库引擎,将上述编译选项转换成CMake编译选项时,下面的几个引擎名字可以被省略,因为编译时,默认就支持:

 csv myisam myisammrg heap 

然后使用下面的编译参数,以启用InnoDB、ARCHIVE和BLACKHOLE引擎支持:


-DWITH_INNOBASE_STORAGE_ENGINE=1 
​    -DWITH_ARCHIVE_STORAGE_ENGINE=1 
​    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 

当然也可以使用“ON”来替代数字1,它们是等效的。

如果想除去对某种引擎的支持,则在CMake编译选项中使用-DWITHOUT__STORAGE_ENGINE,例如:

 
 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 
​    -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 
​    -DWITHOUT_PARTITION_STORAGE_ENGINE=1 

库文件加载选项

该选项指明Mysql使用库的情况:


参数值说明	配置选项			CMake选项
\-------------------------------------------------------------------------
readline库	--with-readline		-DWITH_READLINE=1
SSL库		--with-ssl=/usr		-DWITH_SSL=system
zlib库		--with-zlib-dir=/usr	-DWITH_ZLIB=system
libwrap库	--without-libwrap	-DWITH_LIBWRAP=0

其他选项

CMake编译选项支持大部分之前版本的MySQL编译选项,新老编译选项的差别在于:之前的是小写,现在全部变成了大写,之前采用双横线,现在使用单横线,之前使用的破折号,现在取而代之的是使用下划线,例如:

    --with-debug => WITH_DEBUG=1 
    --with-embedded-server => WITH_EMBEDDED_SERVER 

下面是编译MySQL的新老参数对照表:


参数值说明		配置选项						CMak选项
\--------------------------------------------------------------------------------------------------------------
TCP/IP端口		--with-tcp-port-=3306				-DMYSQL_TCP_PORT=3306
UNIX socket文件		--with-unix-socket-path=/tmp/mysqld.sock	-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
启用加载本地数据		--enable-local-infile				-DENABLED_LOCAL_INFILE=1
扩展字符支持		--with-extra-charsets=all(默认:all)		-DEXTRA_CHARSETS=all(默认:all)
默认字符集		--with-charset=utf8				-DDEFAULT_CHARSET=utf8
默认字符校对		--with-collation=utf8_general_ci		-DDEFAULT_COLLATION=utf8_general_ci
Build the server	--with-server					无
嵌入式服务器		--with-embedded-server				-DWITH_EMBEDDED_SERVER=1
libmysqld权限控制	--with-embedded-privilege-control		无
安装文档			--without-docs					无
Big tables支持		--with-big-tables, --without-big-tables		无
mysqld运行用户		--with-mysqld-user=mysql			-DMYSQL_USER=mysql
调试模式			--without-debug(默认禁用)			-DWITH_DEBUG=0(默认禁用)
GIS支持			--with-geometry					无
社区功能			--enable-community-features			无
Profiling		--disable-profiling(默认启用)			-DENABLE_PROFILING=0(默认启用)
pstack			--without-pstack				无(新版移除该功能)
汇编字符串函数		--enable-assembler				无
构建类型			--build=x86_64-pc-linux-gnu			没有等效参数
交叉编译主机		--host=x86_64-pc-linux-gnu			没有等效参数
客户端标志		--with-client-ldflags=-lstdc++			无
线程安全标志		--enable-thread-safe-client			无
注释存储类型		--with-comment='string'				-DWITH_COMMENT='string'
Shared/static binaries	--enable-shared --enable-static			无
内存使用控制		--with-low-memory				无


[root@zyg mysql-5.6.22]# cmake \
\> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
\> -DMYSQL_DATADIR=/usr/local/mysql/data \
\> -DSYSCONFDIR=/etc \
\> -DWITH_READLINE=1 \
\> -DMYSQL_TCP_PORT=3306 \
\> -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
\> -DENABLED_LOCAL_INFILE=1 \
\> -DEXTRA_CHARSETS=all \
\> -DDEFAULT_CHARSET=utf8 \
\> -DDEFAULT_COLLATION=utf8_general_ci


[root@zyg mysql-5.6.22]# make
[root@zyg mysql-5.6.22]# make install


[root@zyg mysql-5.6.22]# cd /usr/local/mysql/
[root@zyg mysql]# useradd -M -u 27 -s /sbin/nologin mysql
[root@zyg mysql]# ./scripts/mysql_install_db --user=mysql


To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

  ./bin/mysqladmin -u root password 'new-password'
  ./bin/mysqladmin -u root -h zyg.power.com password 'new-password'

Alternatively you can run:

  ./bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:

  cd . ; ./bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl

  cd mysql-test ; perl mysql-test-run.pl

Please report any problems at http://bugs.mysql.com/

The latest information about MySQL is available on the web at

  http://www.mysql.com

Support MySQL by buying support/licenses at http://shop.mysql.com

New default config file was created as ./my.cnf and
will be used by default by the server when you start it.
You may edit this file to change server settings

WARNING: Default config file /etc/my.cnf exists on the system
This file will be read by default by the MySQL server
If you do not want to use this, either remove it, or use the
--defaults-file argument to mysqld_safe when starting the server




[root@zyg mysql]# chown -R root.mysql /usr/local/mysql/
[root@zyg mysql]# chown -R mysql data
[root@zyg mysql]# vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
[root@zyg mysql]# source /etc/profile

[root@zyg mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@zyg mysql]# chmod +x /etc/init.d/mysqld

[root@zyg mysql]# chkconfig --add mysqld
[root@zyg mysql]# chkconfig --list mysqld
mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@zyg mysql]# service mysqld start
Starting MySQL..                                           [  OK  ]
[root@zyg mysql]# netstat -tunpl | grep 3306
tcp        0      0 :::3306                     :::*                        LISTEN      30509/mysqld   


[root@zyg mysql]# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.22 Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


rpm包安装
mysql5.7mysql5.7的默认密码

systemctl restart mysqld
cat /var/log/mysqld.log
2019-04-18T09:22:59.813319Z 1 [Note] A temporary password is generated for root@localhost: (+(FyeLZt8qs

登录

mysql -u root -p"(+(FyeLZt8qs"

修改密码

mysql>  set password=password("Robin_123");

rpm包mysql基本信息

配置文件目录:
/etc/my.cnf
/etc/my.cnf.d/
数据主目录:/var/lib/mysql
端口: 3306
日志文件:/var/log/mysqld.log
启动服务: systemctl restart mysqld

基本操作:


mysql> show databases;   查看所有数据库
mysql> create database mydb;   创建数据库
mysql> use mydb;            切换数据库
mysql> create table user_info(id int,name char(10)); 创建表
mysql> show tables;         显示表
mysql> desc user_info;      描述表(看属性)
mysql> insert into user_info values(1,'robin');   插入数据
mysql> select * from user_info;     查看数据
mysql> drop table user_info;    删除表
mysql> drop database mydb;  删除库


密码不正确:


[root@localhost ftp]# systemctl stop mysqld
[root@localhost ftp]# rm -rf /var/lib/mysql/*
[root@localhost ftp]# > /var/log/mysqld.log
[root@localhost ftp]# mysqld --initialize --datadir=/var/lib/mysql
[root@localhost ftp]# chown -R mysql.mysql /var/lib/mysql
[root@localhost ftp]# cat /var/log/mysqld.log | grep password
[root@localhost ftp]# systemctl restart mysqld
[root@localhost ftp]# mysql -u root -pKTdr2+yppDsq

mysql-rpm

1.配置/etc/my.cnf
/etc/my.cnf.d/ 子配置文件目录

2.数据目录: /var/lib/mysql
3.mysql启动后 套接字:/var/lib/mysql/mysql.sock
4.mysql的命令 /usr/bin/

mysql-src
1.配置/etc/my.cnf
/etc/my.cnf.d/ 子配置文件目录
2.数据目录: /usr/local/mysql/data
3.根据编译参数产生套接字文件:
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock
4.mysql命令/usr/local/mysql/bin/

源码编译:


[root@localhost ftp]# tar -xvf mysql-5.7.18.tar.gz -C /usr/local/src/
[root@localhost mysql-5.7.18]# yum install cmake
[root@localhost src]# cd /usr/local/src/
[root@localhost src]# cd /usr/local/src/mysql-5.7.18/
[root@localhost mysql-5.7.18]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data  -DSYSCONFDIR=/etc -DWITH_READLINE=1 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost

[root@localhost mysql-5.7.18]# make
[root@localhost mysql-5.7.18]# make install

系统中需要有mysql帐号

useradd -u 27 -d /var/lib/mysql -s /bin/false mysql

创建数据目录

[root@localhost mysql]# mkdir /usr/local/mysql/data

不使用rpm产生的配置文件

[root@localhost mysql]# mv /etc/my.cnf /etc/my.cnf.bak

初始化

[root@localhost mysql]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data 

修改权限

[root@localhost mysql]# chown -R mysql.mysql /usr/local/mysql/

启动mysql

[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

检查端口:

[root@localhost mysql]# netstat -anplt | grep :3306
tcp6       0      0 :::3306                 :::*                    LISTEN      60187/mysqld 

登录

[root@localhost mysql]# /usr/local/mysql/bin/mysql -uroot -p"Rkadj:2opk#5"

修改密码

mysql> set password=password('Robin_123');

修改源码mysql的启动方式

[root@localhost support-files]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqldd
[root@localhost support-files]# service  mysqldd restart


开机自启动

[root@localhost support-files]# chkconfig --add mysqldd
[root@localhost support-files]# chkconfig mysqldd on

也可以

[root@localhost support-files]# systemctl restart mysqldd

修改源码客户端

[root@localhost support-files]# vim /etc/profile
PATH=/usr/local/mysql/bin:$PATH
export PATH

[root@localhost support-files]# source /etc/profile

测试登录

[root@localhost support-files]# mysql -u root -pRobin_123

错误1:

CMake Error at cmake/boost.cmake:81 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

  This CMake script will look for boost in <directory>.  If it is not there,
  it will download and unpack it (in that directory) for you.

  If you are inside a firewall, you may need to use an http proxy:

  export http_proxy=http://example.com:80

删除缓存文件

[root@localhost mysql-5.7.18]# rm -rf CMakeCache.txt 

解决:
boost 版本过低

1.在/usr/local下创建一个名为boost的文件夹
mkdir -p /usr/local/boost
2.进入这个新创建的文件夹然后下载boost
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
3.解压
tar -xvzf boost_1_59_0.tar.gz
4.继续cmake,添加上红色部分

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data  -DSYSCONFDIR=/etc -DWITH_READLINE=1 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost

错误2:

CMake Error at cmake/readline.cmake:64 (MESSAGE):
  Curses library not found.  Please install appropriate package,

​      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:107 (FIND_CURSES)
  cmake/readline.cmake:197 (MYSQL_USE_BUNDLED_EDITLINE)
  CMakeLists.txt:488 (MYSQL_CHECK_EDITLINE)

-- Configuring incomplete, errors occurred!

解决:

yum install ncurses-devel

[root@localhost [root@localhost mysql-5.7.18]# rm -rf CMakeCache.txt 

[root@localhost mysql-5.7.18]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data  -DSYSCONFDIR=/etc -DWITH_READLINE=1 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost

错误3:

CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found.   Please set CMAKE_C_COMPILER to a valid compiler path or name.
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found.   Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
-- CMAKE_GENERATOR: Unix Makefiles
CMake Error at cmake/os/Linux.cmake:41 (MESSAGE):
  Unsupported compiler!
Call Stack (most recent call first):
  CMakeLists.txt:169 (INCLUDE)

解决:

yum install gcc  gcc-c++

错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

情况1: socket文件没有在 /var/lib/mysql/mysql.sock

情况2: mysqld服务未启动

解决:
1.查看mysld服务端口 netstat -anplt | grep :3306

a.没端口服务未启动
b.有端口,文件位置不正确
cat /etc/my.cnf
socket=/var/lib/mysql/mysql.sock

3. MySQL架构

MySQL的架构

所谓MySQL的架构指的是MySQL的逻辑架构,了解MySQL的逻辑架构可以帮助我们更好的理解MySQL是如何工作的,以及在MySQL工作过程当中我们需要注意的一些地方,并且理解一些有关于数据库的的基本概念和知识。

MySQL-基础部分_第3张图片

MySQL-基础部分_第4张图片

整个MySQL逻辑架构的总图

MySQL-基础部分_第5张图片

4. SQL语句

1. 类型

DDL—数据定义语言(Create,Alter,Drop,DECLARE)
DML—数据操纵语言(Select,Delete,Update,Insert)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
DQL-数据查询语言(select)

DML(data manipulation language):

​ 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用

DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL


接下来我们逐步学习SQL语句,在学习之前我们先注意一下SQL语句的注意事项.
1.每条SQL语句结束时要以;做为结束符.(除了use命令)
2.SQL语句的关键字不区分大小写(除了库名字和表名字)
3.在查询数据库信息或者表信息时,可以以\G做为结束符,表示以文本模式输出
4.当你不需要一条语句输出的结果以\c结束,不可以使用ctrl+c,否则登出mysql.
5.我们可以在命令行执行sql语句,要通过mysql -e参数
mysql -e “show databases \G” 显示到shell上
6.如果需要获取SQL语句的帮助可以用help命令
如:help create
如果需要进一步获取帮助,可以继续使用help命令
如:help create database


2. DDL数据库定义语句

建立数据库以及查询
create database db;
create database db CHARACTER SET = ‘utf8’
show databases;
show create database db;
alter database db CHARACTER SET = ‘latin1’;
修改库名只需要改数据库目录名称
drop database db;

练习:

1.创建数据库 字符集为latin1
2.修改数据库 字符集为utf8
3.删除数据库

1.创建数据库 字符集为latin1

mysql> create database db character set = 'latin1';
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

mysql> show create database db;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| db       | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

2. 修改数据库 字符集为utf8

mysql> alter database db character set = 'utf8';
Query OK, 1 row affected (0.00 sec)

mysql> show create database db;
+----------+-------------------------------------------------------------+
| Database | Create Database                                             |
+----------+-------------------------------------------------------------+
| db       | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)


3.删除数据库

mysql> drop database db;
Query OK, 0 rows affected (0.00 sec)

mysql> 

建立表以及查询

数据类型
数值类型 
整数类型        字节       范围(有符号)      范围(无符号unsigned)       用途 
TINYINT        1字节        (-128,127)          (0,255)            小整数值 
SMALLINT       2字节     (-32 768,32 767)       (0,65 535)         大整数值 
MEDIUMINT      3字节    (-8 388 608,8 388 607) (0,16 777 215)      大整数值 
INT或INTEGER   4字节   (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 
BIGINT         8字节   (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 
FLOAT          4字节   (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值  (7个有效位)
DOUBLE         8字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值  (15个有效位)
DECIMAL   不存在精度损失,常用于银行帐目计算。(28个有效位)

# desc显示概述信息

float类型出现不精确情况

mysql> create table t1(money float(10,2));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t1 values(697302.68);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+-----------+
| money     |
+-----------+
| 697302.69 |
+-----------+
1 row in set (0.01 sec)

超出数值范围
mysql> create table t1(age tinyint);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into t1 values(500);
ERROR 1264 (22003): Out of range value for column 'age' at row 1

mysql> select @@sql_mode 
    -> ;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 


mysql> select @@sql_mode
    -> ;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
1. 三种sql_mode模式

mysql5.0以上版本支持三种sql_mode模式

ANSI、TRADITIONAL和STRICT_TRANS_TABLES。

ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。

TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。

STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

临时修改模式: 可以插入数据,报warning

mysql> set @@sql_mode=ANSI;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 values(500);
Query OK, 1 row affected, 1 warning (0.01 sec)
2. 字符串类型

char和varchar区别:

#char类型:定长,简单粗暴,浪费空间,存取速度快
    字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
    存储:
        存储char类型的值时,会往右填充空格来满足长度
        例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

    检索:
        在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';#varchar类型:变长,精准,节省空间,存取速度慢
    字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
    存储:
        varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
        强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
        如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
        如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

    检索:
        尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
        
      
区别:
	char定义的是多少,不管写入了几个字符,定义的是多少写入的就占用的就是多少 比如char(10),robin写入robin就占用10
	varchar是定义的是多少,写入几个占几个。
char类型
create table t1(id int(6),name char(10));

mysql> create table t1(id int,name char(5));
Query OK, 0 rows affected (0.06 sec)

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| name  | char(5) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(1,"robin");
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values(1,"robin11");
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
+------+-------+
1 row in set (0.00 sec)

varchar类型
create table t1(id int(6),name varchar(10));

mysql> create table t2(id int,name varchar(5));
Query OK, 0 rows affected (0.05 sec)

mysql> desc t2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  |     | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t2 values(1,"robin123");
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> select * from t2;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
+------+-------+
1 row in set (0.00 sec)
3. 日期时间类型
1. date类型
1. date类型

create table t4(aa date);
insert into t4 values('2010-04-01'),(20100401);

#========================================================================================
例:
mysql> create table t3(adate date);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t3 values('20201116'),(20200412);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+------------+
| adate      |
+------------+
| 2020-11-16 |
| 2020-04-12 |
+------------+
2 rows in set (0.00 sec)
2. time类型
2. time类型

create table t5(showttime time);
insert into t5 values ('11:11:11'),('11:11'),('111111');

#========================================================================================
例:
mysql> create table t4(atime time);
Query OK, 0 rows affected (0.00 sec)

mysql> desc t4;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| atime | time | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> insert into t4 values ('111111');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t4 values ('1111');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t4 values ('11:11');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t4;
+----------+
| atime    |
+----------+
| 11:11:11 |
| 00:11:11 |
| 11:11:00 |
+----------+

3 rows in set (0.00 sec)

【注】未使用分隔符直接输入像1111这样的数字,默认是十一分十一秒
	 中间加入分隔符号显示就是小时分钟


出现的问题
create table t6 (a_data date,a_time time);
insert into t6 values('1978-4-6',123412),(651212,'3:5:6');
select * from t6;
+------------+----------+
| a_date     | a_time   |
+------------+----------+
| 1978-04-06 | 12:34:12 |
| 2065-12-12 | 03:05:06 |
+------------+----------+

【注】
输入65显示的是2065 输入70显示的1970
年份的范围00-69为2000-2069&&70-99为1970-1999	

#========================================================================================
例:
mysql> create table t5 (a_data date,a_time time);
Query OK, 0 rows affected (0.01 sec)

mysql> desc t5;
+--------+------+------+-----+---------+-------+
| Field  | Type | Null | Key | Default | Extra |
+--------+------+------+-----+---------+-------+
| a_data | date | YES  |     | NULL    |       |
| a_time | time | YES  |     | NULL    |       |
+--------+------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> select * from t5 ;
+------------+----------+
| a_data     | a_time   |
+------------+----------+
| 1978-04-06 | 12:34:12 |
| 2065-12-12 | 03:05:06 |
+------------+----------+
2 rows in set (0.00 sec)
3. year类型
3. year类型

create table t7 (year year);
insert into t7 values(2003),(04),(53),(89),(90);
select * from t7;
+------+
| year |
+------+
| 2003 |
| 2004 |
| 2053 |
| 1989 |
| 1990 |
+------+

#========================================================================================
例:
mysql> create table t6(year year);
Query OK, 0 rows affected (0.38 sec)

mysql> insert into t6 values(2003),(04),(53),(89),(90);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from t6;
+------+
| year |
+------+
| 2003 |
| 2004 |
| 2053 |
| 1989 |
| 1990 |
+------+
5 rows in set (0.00 sec)


4. datetime和timestamp类型
datetime和timestamp类型
create table t8(f_datetime datetime,f_timestamp timestamp);
insert into t8 values('1999-11-11 11:11:11','2002-11-111:11:11');
insert into t8 values(19991111111111,20021111111111);
insert into t8 values(now(),null);
select * from t8;
+---------------------+---------------------+
| f_datetime          | f_timestamp         |
+---------------------+---------------------+
| 1999-11-11 11:11:11 | 2002-11-11 11:11:11 |
| 1999-11-11 11:11:11 | 2002-11-11 11:11:11 |
| 2012-03-21 21:05:21 | 2012-03-21 21:05:21 |
+---------------------+---------------------+

#=======================================================================================
例:
mysql> create table t7(f_datetime datetime,f_timestamp timestamp);
Query OK, 0 rows affected (0.08 sec)

mysql> desc t7;
+-------------+-----------+------+-----+-------------------+-----------------------------+
| Field       | Type      | Null | Key | Default           | Extra                       |
+-------------+-----------+------+-----+-------------------+-----------------------------+
| f_datetime  | datetime  | YES  |     | NULL              |                             |
| f_timestamp | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+-----------+------+-----+-------------------+-----------------------------+
2 rows in set (0.00 sec)


mysql> insert into t7 values('1999-11-11 11:11:11','2002-11-1 11:11:11');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t7 values(19991111111111,20021111111111);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t7 values(now(),null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t7;
+---------------------+---------------------+
| f_datetime          | f_timestamp         |
+---------------------+---------------------+
| 1999-11-11 11:11:11 | 2002-11-01 11:11:11 |
| 1999-11-11 11:11:11 | 2002-11-11 11:11:11 |
| 2020-11-16 13:49:54 | 2020-11-16 13:49:54 |
+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 


【注】datetime是静态的不会改变时间 
	 timestamp是动态的,修改表时时间会改变。
3. ENUM和SET类型

enum是多个选项选择一个,set可以选择多个

create table t10(gerder ENUM('M','F'));	
insert into t10 values('M'),('m'),('F'),('aa'),(null);
select * from t10;
+------+
| gender  |
+------+
| M    |
| M    |
| F    |
|      |
| NULL |
+------+

#========================================================================================
例:
mysql> create table t8(name char(5),sex enum('M','F'));
Query OK, 0 rows affected (0.08 sec)

mysql> desc t8;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| name  | char(5)       | YES  |     | NULL    |       |
| sex   | enum('M','F') | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t8 values('robin','M');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values('zorro','M');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values('king','MF');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

mysql> select * from t8;
+-------+------+
| name  | sex  |
+-------+------+
| robin | M    |
| zorro | M    |
+-------+------+
2 rows in set (0.00 sec)


#========================================================================================






create table t11 (type SET('a','b','c','d','e'));
insert into t11 values(a);
insert into t11 values('b,c');
insert into t11 values('J');
select * from t11;
+------+
| type |
+------+
| a    |
| b,c  |
|      |
+------+
insert into t11 values('b,c,e,f');既有合法字符又有非法字符
select * from t11;                                                  
+-------+
| type  |
+-------+
| a     |
| b,c   |
|       |
| b,c,e |
+-------+


【注】 当使用数字进行选择时出现的结果是将其转换为二进制数字进行匹配的字符。
#========================================================================================

例:

mysql> create table t9 (name char(5),type SET('a','b','c','d','e'));
Query OK, 0 rows affected (0.08 sec)

mysql> desc t9;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| name  | char(5)                  | YES  |     | NULL    |       |
| type  | set('a','b','c','d','e') | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into t9 values('robin','a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values('robin','a,b,c');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values('robin','3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t9;
+-------+-------+
| name  | type  |
+-------+-------+
| robin | a     |
| robin | a,b,c |
| robin | a,b   |
+-------+-------+
3 rows in set (0.00 sec)

练习:

创建表test  

id name money gender hobby email qq  idcard jointime 

create table test(id tinyint,name char(10),money float(10,2),gender enum('M','F'),hobby set('a','b','c'),email varchar(50),qq char(15),shenfenzheng char(18),jointime datetime);

mysql> rename table test to newtest;
mysql> alter table test change id uid smallint;
mysql> alter table test modify id smallint;
4. 修饰符(约束)

无符号 unsigned
用0补齐 zerofill

int(5) int里面的数字表示的不足几位用0补齐。

desc t11;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| type  | set('a','b','c','d','e') | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+

1. not null约束

create table t12 (id int,gender enum('M','W') NOT NULL );
desc t12;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| id     | int(11)       | YES  |     | NULL    |       |
| gender | enum('M','W') | NO   |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
insert into t12(id) values(1);
Query OK, 1 row affected (0.00 sec)

mysql>  select * from t12;
+------+--------+
| id   | gender |
+------+--------+
|    1 | M      |
+------+--------+




2. DEFAULT约束
create table t13 (id int ,gender enum('M','W') NOT NULL default 'M' );
desc t13;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| id     | int(11)       | YES  |     | NULL    |       |
| gender | enum('M','W') | NO   |     | M       |       |
+--------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
insert into t13(id) values(3);
mysql> select * from t13;
+------+--------+
| id   | gender |
+------+--------+
|    3 | M      |
+------+--------+
1 row in set (0.00 sec)

5. 索引建立
create table t15(id int not null ,name char(10),index(id));
desc t15;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | MUL | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+

1. 创建表时添加索引
create table t16(id int not null ,name char(10),index(id));
 desc t16;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+


2. 添加索引的两种方式

创建索引
create index id on t16 (id);

向已有表添加索引
alter table t17 add index(id);

desc t16;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | MUL | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+


3. 删除索引
drop index id on t16;
desc t16;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+


4. 查询索引
show index from t16;

UNIQUE索引(允许空值)

create table t17(id int ,name char(10),unique(id));
desc t17;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  | UNI | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into t17 values(null,'zhb');
 select * from t17;
+------+------+
| id   | name |
+------+------+
| NULL | zhb  |
+------+------+
6. PRIMARY KEY

PRIMARY KEY(主键约束 值唯一 uniq和not null的结合)

create table t18(id int,name char(10),primary key(id));
 desc t18;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
insert into t18 values(1,'zhb');
select * from t18;
+----+------+
| id | name |
+----+------+
|  1 | zhb  |
+----+------+
insert into t18 values(1,'zhb');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' 不允许重复

1. 删除主键
mysql> alter table t19 drop primary key;


2. 向已有表添加主键
mysql> alter table t19 add primary key(id);

3. 在多个列上建立主键
create table t19(id int,name char(10),primary key(id,name));
desc t19;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | NO   | PRI |         |       |
+-------+----------+------+-----+---------+-------+
 insert into t19 values(1,'zhb');
 insert into t19 values(1,'zorro');
select * from t19;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhb   |
|  1 | zorro |
+----+-------+


4. 外键myisam引擎不支持只能用innodb引擎
create table dpmnt(id int not null,name char(10) not null,primary key(id)) type = INNODB;
desc dpmnt;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(10) | NO   |     | NULL    |       |
+-------+----------+------+-----+---------+-------+


5. 建立外键
create table emp (id int not null, name char(10) not null,fk_dpmnt int not null ,primary key(id),index (fk_dpmnt),foreign key (fk_dpmnt) references dpmnt(id)) type=innodb;
desc emp;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | NO   | PRI | NULL    |       |
| name     | char(10) | NO   |     | NULL    |       |
| fk_dpmnt | int(11)  | NO   | MUL | NULL    |       |
+----------+----------+------+-----+---------+-------+
 insert into dpmnt  values(1,hr);
 insert into dpmnt  values(2,'yw');
 insert into emp values(10,'zhb',3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`emp`, CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`fk_dpmnt`) REFERENCES `dpmnt` (`id`))

fk_dpmnt字段的数据必须得是dpmnt表里有的不然报错...

即使表存在外键约束,MySQL还允许我们删除表,并且不会产生错误。这是删除外键的方法。
alter table emp drop foreign key  emp_ibfk_1;
删除外键
7. 全文本索引
create table t22(id int,name char(10),fulltext(id));

练习:

创建表test  id name money gender hobby email qq shenfezheng jointime 

create table test(id tinyint,name char(10),money float(10,2),gender enum('M','F'),hobby set('a','b','c'),email varchar(50),qq char(15),shenfenzheng char(18),jointime datetime);

1.添加约束
create table test1 ( id int primary key auto_increment, name char(20) not null, money float(10,2) not null, gender enum('M','F') not null default 'M', hobby set('a','b','c') not null default 'a', qq char(15) unique, email char(50), jointime datetime,index(email));


2.删除掉所有的约束

# 删除auto_increment
alter table test1 modify id int; 
# 删除primary key
alter table test1 drop primary key; 
# 删除 not null
alter table test1 modify id int;  

alter table test1 modify name char(10);
alter table test1 modify money float(10,2);
alter table test1 modify gender enum('M','F');
alter table test1 modify hobby set('a','b','c');

# 删除索引
drop index qq on test1;
drop index email on test1;

3.在添加约束
alter table test1 add primary key(id);
alter table test1 modify id int auto_increment;
alter table test add unique(qq);
alter table test add unique(idcard)

4. 显示表信息
show tables;
show create table t1;

5. 重新修改信息
alter table t2 RENAME t1;
alter table t2 MODIFY a tinyint  not null,CHANGE b c char(20);
create table members ( id int(11),name char(10),tel char(15));
alter table members ADD qq int;
alter table members drop qq;
alter table members add qq int after name ;
alter table members add phone first;
alter table test1 modify qq char(15) after id;

drop table t1;

create table user(
id int primary key auto_increment,
name varchar(30) not null,
money float(10,2),
gender enum('M','F') not null,
hobby set('a','b','c','d'),
email varchar(50) unique,
qq char(15) unique,
idcard char(18) unique,
jointime datetime not null,
index(name));


 修改行列使用change

3.DML 数据库操作语句

1. 三种操作
1. insert
insert 插入语句
mysql> INSERT INTO members ( member_id,fname,lname,tel,email) VALUES ( NULL,'john','Doe','1234567','[email protected]');
mysql> INSERT INTO members VALUES ( NULL,'kyo','oyk','7654321','[email protected]');
mysql> INSERT INTO members (fname,lname,email,tel,member_id) VALUES ('bob','kk','[email protected]','22334455',NULL);
2. update
update 修改语句
mysql> UPDATE members SET email = '[email protected]' WHERE member_id = 3;
mysql> UPDATE members SET email = '[email protected]',lname = 'ho' WHERE member_id = 2;
3. delete
delete 删除语句
mysql> DELETE FROM members;
mysql> DELETE FROM members WHERE member_id = 1;
2. sql语句使用

连接数据库:mysql -u root -p123 -h localhost

查看服务器状态:show staus;

显示所有数据库名:show databases;

使用数据库:use db;

显示当前数据库中的所有表:show tables;

查看表结构:desc tables;

1. select查询语句

从表中查询指定列:select name from tables;

指定多个列名:select id,name,sal from tables;

查询所有的列:select * from tables;

去掉重复行 :select distinct id from tables;

显示前5行:select name from tables limit 5;

显示从第5行开始的后5行即6-10行:select name from tables limit 5,5;

没有使用use进入db库时查询db库的t1表:select name from db.t1;

指定库的表 指定表的列:select t1.name from db.t1;

显示mysql中第一个用户名字?

在shell命令行显示用户的名字和密码

2. 修改root帐号

修改密码为456

1.停止服务:killall mysqld

2.跳过授权表启动服务

[root@robin mysql]# /usr/local/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables &

3.修改密码

mysql> update mysql.user set password=password(‘123’) where user=‘root’ and host=‘localhost’;

mysql.5.7
update mysql.user set authentication_string=password(‘123’) where user=‘root’;

4.关闭服务

5.正常启动服务,登录

3. 排序检索语句

按id排序:select id,name from t1 order by id;

先按id排序id相同在按name排序:select id,name from t1 order by id,name;

按id反向排序:select id,name from t1 order by id desc;

先按id反向排序再按名字排序:select id,name from t1 order by id desc,name;

查找工资最高的人:select id,name,sal from t1 order by sal desc limit 1;

where子句

查找tom的信息:select id,name,sal from t1 where name=‘tom’;

where 子句的操作符

=	等于
<>	不等于
!=	不等于
<	小于
<=	小于等于
>	大于
>	=	大于等于
>	between 5 and 10 在两个值之间
>	is null 空值
>	is not null 非空值

and操作符表示两个条件都要满足 与操作:select id,name from t1 where id>5 and name=‘tom’;

or操作符表示满足任意条件 或操作:select id,name from t1 where id=10 or name=‘tom’;

id为10的 或者id为20并且薪水大于5000的;and优先执行:select id,name,sal from t1 where id=10 or id=20 and sal > 5000;

id为10或者20 并且薪水大于5000的:select id,name,sal from t1 where (id=10 or id=20) and sal > 5000;

id在 10 20 30 中的记录:select id,name,sal from t1 where id in (10,20,30);

这条语句用or可以做到相同的结果,那in的好处

1.in的语法更加直观

2.in的计算次序更容易管理(操作符少)

3.in 一般比or执行的更快

4.in的最大优点可以包含其他子句 or不行

取最高薪水的人

select * from test2 where money=(select money from test2 order by money desc limit 1);

select id,name,sal from t1 where id not in (10,20,30); id不在10 20 30的记录 not找到不匹配的记录更简单

通配符%匹配多个字符_匹配一个字符_

select id,name from t1 where name like ‘jer%’;模糊查询名字为jer开头的记录

select id,name from t1 where name like ‘j%y’; 匹配j开头y结尾的

select id,name from t1 where name like ‘_err%’ 匹配e前边有一个字符的记录

原则:

尽量少使用通配符,如果其他操作符能做到就不要使用通配符

在确实需要通配符时,尽量不要使用%erry 这种用法搜索起来会更慢

至于使用位置,使用错了得不到想要的结果

正则表达式的使用regexp

select id,name from t1 where name regexp ‘je*’;调用正则匹配je开头

select id,name from t1 where name regexp ‘y$’ ;

语句的拼接

select concat(id ,’(’,name,’)’) from t1 将id和name 拼接为1列 oracle用||

select concat(id ,’(’,name,’)’) all_name from t1 别名也可以使用as

select sal*12 from t1 计算全年薪水 + - * /

函数使用

select upper(name) as new_name from t1; 将名字转换为大写 lower 小写

group by 分组 必须在where之后 分组前过滤 having 可以分组后过滤

sum max min avg count year month day hour minute second

insert into new values(1,'robin',10000,'M',"a,b",'12345678','123456789012345678',"2010-10-10 10:10:10","[email protected]");
insert into new values(2,'zorro',20000,'M',"b,c",'123456789','123456789012345679',"2011-11-10 10:10:10","[email protected]");
insert into new values(3,'jack',15000,'M',"a,b,c",'1234569','123456789012345698',"2009-12-10 10:10:10","[email protected]");


练习:

cpu
prod_name prod_pris  vender_name  prod_date 
cpu1             1200         inter                2018-10-10
cpu2             800           amd                2017-10-10

1.求各厂商最贵的cpu价钱
2.求各厂商最贵的cpu名字
 select prod_name,prod_pris,cpu.vender_name,vender_date from cpu,(select vender_name,max(prod_pris) as new_pris from cpu group by vender_name) as new where cpu.vender_name = new.vender_name and cpu.prod_pris = new.new_pris;

1.作业1
修改库名

2.bank系统 (mysql数据库)

5. MySQL引擎

1. 查看MySQL引擎
mysql> mysql> show engines\G

默认搜索引擎是InnoDB
*************************** 1. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES

需要使用MyISAM引擎才可以使用
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO

写入内存,可以存储临时数据,开机重启则消失
只有一个表  t5.frm
*************************** 3. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO

黑洞:此类型引擎不保存数据
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO

使用此类引擎时创建表有三个数据 一个是数据 一个是结构 一个是索引
t1.frm  t1.MYD  t1.MYI  t2.frm  t2.MYD  t2.MYI
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

2. 使用不同引擎创建表进行对比
create table t10(id int,name char(10)) engine=myisam;
create table t20(id int,name char(10)) engine=myisam;
使用此类引擎时创建表有三个数据 一个是数据 一个是结构 一个是索引
t1.frm  t1.MYD  t1.MYI  t2.frm  t2.MYD  t2.MYI

mysql> create table t1(id int,name char(10)) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table t1/t2;
+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)





create table t30(id int,name char(10)) union=(t10,t20) engine=mrg_myisam;

创建完显示结构
t3.frm  t3.MRG
mysql> insert into t1 values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)
可以进行修改 但不能进行写入新表 修改t3只能修改t3里面有的数据,若想要添加数据则需要制定哪个表才行。

create table t40(id int,name char(10)) union=(t10,t20) INSERT_METHOD=first engine=mrg_myisam;

【注】上述的insert_methed=first last表示的是使用第一个表或者最后一个表进行添加数据。t4加入了数据,如果使用的是first选项,则第一表t1也会存入数据。 

如:
mysql> create table t4(id int,name char(10)) union=(t1,t2) INSERT_METHOD=first engine=mrg_myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t4 values(3,'king');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t4;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    3 | king  |
|    2 | zorro |
+------+-------+
3 rows in set (0.00 sec)


mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    3 | king  |
+------+-------+
2 rows in set (0.00 sec)
3. mysql视图
1. 单表视图
create view new_emp as select * from emp;


create view new_emp1 as select uid,name,money from emp;

修改视图=修改源表

mysql> create table emp(uid int,name char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into emp values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> create table dpt(uid int,dep char(10));
Query OK, 0 rows affected (0.35 sec)

mysql> insert into dpt values(1,'cw');
Query OK, 1 row affected (0.01 sec)

mysql> insert into dpt values(2,'kf');
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+------+-------+
| uid  | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)

mysql> select * from dpt;
+------+------+
| uid  | dep  |
+------+------+
|    1 | cw   |
|    2 | kf   |
+------+------+
2 rows in set (0.00 sec)


mysql> create view new_emp as select * from emp;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from new_emp;
+------+-------+
| uid  | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)
2. 多表视图
create table tt1(id int,name char(10),did int);



create table tt2(did int,dname char(10));

实验

mysql> create table emp(uid int,name char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into emp values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> create table dpt(uid int,dep char(10));
Query OK, 0 rows affected (0.35 sec)

mysql> insert into dpt values(1,'cw');
Query OK, 1 row affected (0.01 sec)

mysql> insert into dpt values(2,'kf');
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+------+-------+
| uid  | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)

mysql> select * from dpt;
+------+------+
| uid  | dep  |
+------+------+
|    1 | cw   |
|    2 | kf   |
+------+------+
2 rows in set (0.00 sec)


mysql> create view new_view1 as (select name,dep from emp,dpt where emp.uid=dpt.uid);
Query OK, 0 rows affected (0.00 sec)

mysql> select * from new_view1;
+-------+------+
| name  | dep  |
+-------+------+
| robin | cw   |
| zorro | kf   |
+-------+------+
2 rows in set (0.00 sec)
3. 多表查询
select tt1.id,tt1.name,tt2.did,tt2.dname from tt1,tt2 where tt1.did=tt2.did;

create view kk as select tt1.id,tt1.name,tt2.did,tt2.dname from tt1,tt2 where tt1.did=tt2.did;

create view kkk as select tt1.name,tt2.dname from tt1,tt2 where tt1.did=tt2.did;

4. 存储引擎是什么?

​ MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据

MyISAM

mysql> create table t2(id int,name char(10)) engine=myisam;
Query OK, 0 rows affected (0.06 sec)



InnoDB  默认引擎

MRG_MYISAM  将myisam的分表全部显示在一个表中

MEMORY  内存表,可以存储临时数据,开机启动则消失

创建memory引擎表

mysql> create table t5(id int,name char(10)) engine=memory;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t5 values(3,'king');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t5;
+------+------+
| id   | name |
+------+------+
|    3 | king |
+------+------+
1 row in set (0.00 sec)


1. MyISAM

​ MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。

​ 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名 为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 MyISAM文件的格式是平台无关的,这意味着你可以将数据和索引文件从一个intel服务器上拷贝到一台PowerPC或者Sun SPARC上,而不会出任何问题。

主要区别

MyISAM是非事务安全型的,而InnoDB是事务安全型的。

MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

MyISAM支持全文类型索引,而InnoDB不支持全文索引。

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename engine=innodb)。

mysql的配置文件:/etc/my.cnf /usr/my.cnf /usr/local/mysql/my.cnf

独占表空间和共享表空间

innodb_file_per_table=1 独立

innodb_file_per_table=0 共享

5.INOODB引擎
1. 外键索引

外键myisam引擎不支持只能用innodb引擎

mysql> create table dpmnt(id int,name char(10) not null,primary key(id));
Query OK, 0 rows affected (0.06 sec)


mysql> desc dpmnt;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(10) | NO   |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)


mysql> show create table dpmnt;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                            |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------+
| dpmnt | CREATE TABLE `dpmnt` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2. 建立外键
mysql> create table emp (id int not null, name char(10) not null,fk_dpmnt int not null ,primary key(id),index (fk_dpmnt),foreign key (fk_dpmnt) references dpmnt(id)) type=innodb;

mysql> desc emp1;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id       | int(11)  | NO   | PRI | NULL    |       |
| name     | char(10) | NO   |     | NULL    |       |
| fk_dpmnt | int(11)  | NO   | MUL | NULL    |       |
+----------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)


insert into dpmnt  values(1,hr);
insert into dpmnt  values(2,'yw');
 
mysql> insert into emp1 values(10,'zhb',3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`emp1`, CONSTRAINT `emp1_ibfk_1` FOREIGN KEY (`fk_dpmnt`) REFERENCES `dpmnt` (`id`))
mysql> 

fk_dpmnt字段的数据必须得是dpmnt表里有的不然报错...

即使表存在外键约束,MySQL还允许我们删除表,并且不会产生错误。这是删除外键的方法。

alter table emp drop foreign key  emp_ibfk_1;

删除外键

alter table emp drop foreign key  emp_ibfk_1;

添加外键

alter table emp add CONSTRAINT fk_1 foreign key(did) references dpt(did);



create table dpt(did int primary key,dname char(10))
create table emp(id int,name char(10),did int,foreign key (did) references dpt(did) );

insert into emp values(1,'robin',10);
insert into emp values(2,'zorro',30);  

alter table emp drop foreign key emp_ibfk_1;
alter table emp add foreign key (did) references dpt(did);
alter table emp add CONSTRAINT emp_dpt_fk foreign key (did) references dpt(did);

级联删除,级联更新

mysql> create table emp(id int,name char(10),did int,foreign key (did) references dpt(did) ON DELETE CASCADE on update cascade);


3. 表级锁和行级锁

行级锁:对正在被修改的行进行锁定,其它的用户可以访问被锁定的行以外的行。表级锁:锁定整个表,限其他用户对表的访问

4. 事务的支持

事务处理是一种机制,用来管理成批执行的sql语句,以保证数据库不包含不完整的操作结果,他们或者为整体执行完成,或者完全不执行(如果

没有错误发生整组语句提交到数据库,如果发生错误,则进行回退,以保证数据的安全)

事务 transaction 指定一组sql语句

回退 rollback 撤销指定的sql语句(只能回退insert delete update语句)

提交 commit 提交未存储的sql语句

保留点 savepoint 事务处理中设置的临时占位符 你可以对它发布回退(与整个事务回退不同)

create table t11(id int,name char(10)) engine=innodb;

start transaction;
delete from t11;

select * from t11;
Empty set (0.00 sec)

rollback;

select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | zorro |
|    2 | zorro |
|    2 | zorro |
+------+-------+

提交
start transaction;
insert into t11 values(3,'tom');
select * from t11;
commit;

保留点
start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(5,'haha');
Query OK, 1 row affected (0.01 sec)

mysql> savepoint insert1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
|    3 | zorro |
|    4 | seker |
|    5 | haha  |
+------+-------+
5 rows in set (0.00 sec)

mysql> delete from t11 where id=4;
Query OK, 1 row affected (0.00 sec)

mysql> savepoint delete1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
|    3 | zorro |
|    5 | haha  |
+------+-------+
4 rows in set (0.00 sec)

mysql> delete from t11 where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> savepoint delete2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    2 | jerry |
|    3 | zorro |
|    5 | haha  |
+------+-------+
3 rows in set (0.01 sec)

mysql> rollback to delete1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t11;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
|    3 | zorro |
|    5 | haha  |
+------+-------+
4 rows in set (0.00 sec)


2. mrg_myisam实验
create table a1(id int,name char(10)) engine=myisam;
create table a2(id int,name char(10)) engine=myisam;
insert into a1 values(1,'robin');
insert into a2 values(2,'zorro');
mysql> select * from a3;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
insert into a1 values(3,'tom');
select * from a3;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    3 | tom   |
|    2 | zorro |
+------+-------+
mysql> drop table a3;
mysql> create table a3 (id int,name char(10)) union=(a1,a2) INSERT_METHOD=first engine=mrg_myisam;




create table dpt(did int primary key,dname char(10)) engine=innodb;

create table emp(id int primary key,name char(30),did int,foreign key(did) references dpt(did)) engine=innodb;



alter table emp drop foreign key  emp_ibfk_1;
删除外键
添加外键
alter table emp add CONSTRAINT fk_1 foreign key(did) references dpt(did);
	

6. 用户权限和访问控制

1. 创建用户并设置密码

创建用户名和密码 identified by 后面跟着的是密码
create user zorro identified by '123';

@localhost的意思是只允许本地登录
create user zorro@localhost identified by '123';

@‘%’意思是允许任何主机用户都允许使用此账号密码登录
create user zorro@'%' identified by '123';


【注】
在创建密码时,密码要符合规则。首字母大写并有特殊字符,长度满8位

查询

select user from mysql.user\G;


*************************** 1. row ***************************
                  Host: localhost
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *AAB2FB5B72A08C204CFE9A17A133F5F010CA4282
      password_expired: N
 password_last_changed: 2020-11-13 11:34:19
     password_lifetime: NULL
        account_locked: N
*************************** 2. row ***************************
                  Host: localhost
                  User: mysql.session
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: Y
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
      password_expired: N
 password_last_changed: 2020-11-13 11:31:25
     password_lifetime: NULL
        account_locked: Y
*************************** 3. row ***************************
                  Host: localhost
                  User: mysql.sys
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
      password_expired: N
 password_last_changed: 2020-11-13 11:31:25
     password_lifetime: NULL
        account_locked: Y
3 rows in set (0.00 sec)

修改用户名

rename user zorro to robin;
select user from mysql.user;


mysql> select user from mysql.user;

+---------------+
| user          |
+---------------+
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
3 rows in set (0.00 sec)

mysql> create user chen identified by 'Chen_123';
Query OK, 0 rows affected (0.00 sec)

mysql> rename user chen to zorro;
Query OK, 0 rows affected (0.00 sec)

mysql> select user from mysql.user;

+---------------+
| user          |
+---------------+
| zorro         |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
4 rows in set (0.00 sec)

mysql> 



删除

drop user robin;

mysql> drop user zorro;
Query OK, 0 rows affected (0.00 sec)

mysql> select user from mysql.user
    -> ;
+---------------+
| user          |
+---------------+
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
3 rows in set (0.00 sec)

修改用户密码

set password for 'zorro'@'%'= password('123'); password()函数加密

set password = password('123');修改当前用户

2. root密码丢失

重置root口令

1.  shell> mysqld_safe --skip-grant-tables --skip-networking &
2.  mysql>update mysql.user set password=password('123') where host='localhost' and user='root'


[root@7-1 ~]# vim /etc/my.cnf
#skip-grant-tables
[root@7-1 ~]# systemctl restart mysqld

登录数据库,无需密码验证即可以登录上

查询所有用户和信息
mysql> select * from mysql.user\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *AAB2FB5B72A08C204CFE9A17A133F5F010CA4282
      password_expired: N
 password_last_changed: 2020-11-13 11:34:19
     password_lifetime: NULL
        account_locked: N
*************************** 2. row ***************************
                  Host: localhost
                  User: mysql.session
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: Y
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
      password_expired: N
 password_last_changed: 2020-11-13 11:31:25
     password_lifetime: NULL
        account_locked: Y
*************************** 3. row ***************************
                  Host: localhost
                  User: mysql.sys
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE
      password_expired: N
 password_last_changed: 2020-11-13 11:31:25
     password_lifetime: NULL
        account_locked: Y
3 rows in set (0.00 sec)




mysql> update mysql.user set authentication_string=password('123') where Host='localhost' and  User='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

退出注释
[root@7-1 ~]# vim /etc/my.cnf
#skip-grant-tables
然后重启数据库服务,使用新的密码即可登录


【注】修改密码时需要密码需要使用单引号扩上,User Host的等于号后面都需要使用引号。不使用是错误的
1. 修改密码安全策略

之前在CentOS安装完MySQL修改默认密码时出现了如下错误:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

原因是因为密码设置的过于简单会报错,MySQL有密码设置的规范,具体是与validate_password_policy的值有关,下图表明该值规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfZqZ839-1631085794326)(https://i.loli.net/2020/12/07/1fn6sgGPbdTNoV8.png)]

如果想要查看MySQL完整的初始密码规则,登陆后执行以下命令

SHOW VARIABLES LIKE 'validate_password%';

密码的长度是由validate_password_length决定的,但是可以通过以下命令修改

set global validate_password_length=4;

validate_password_policy决定密码的验证策略,默认等级为MEDIUM(中等),可通过以下命令修改为LOW(低)

set global validate_password_policy=0;

修改完成后密码就可以设置的很简单,比如1234之类的。

3. 查询用户权限


show grants for zorro \G

*************************** 1. row ***************************
Grants for zorro@%: GRANT USAGE ON *.* TO 'zorro'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'

mysql> show grants for zorro\G
*************************** 1. row ***************************
Grants for zorro@%: GRANT USAGE ON *.* TO 'zorro'@'%'
1 row in set (0.00 sec)

【注】
USAGE表示没有任何权限
1. 连接测试
mysql -u zorro -p123

ERROR 1045 (28000): Access denied for user 'zorro'@'localhost' (using password: YES)
失败


mysql> select * from mysql.user\G
ERROR 1142 (42000): SELECT command denied to user 'zorro'@'localhost' for table 'user'
2. 权限

MySQL存取控制包含2个阶段:

​ 阶段1:服务器检查是否允许你连接。

​ 阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例

如,如果你从数据库表中选择(select)行或从数据库删除表,服务器确定你对表有SELECT权限或

对数据库有DROP权限。

3. 授权grant

命令格式

grant 权限 on 库.表 to 用户@主机 [密码]

grant select on hr.* to zorro@'localhost';

grant all on *.* to zhangsan@'%';
就算是给全部的权限,grant权限也不会给
*.*表示所有的库所有的表

show grants for zorro \G



*************************** 1. row ***************************
Grants for zorro@%: GRANT USAGE ON *.* TO 'zorro'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'
*************************** 2. row ***************************
Grants for zorro@%: GRANT SELECT ON `hr`.* TO 'zorro'@'%'
4. 移除权限revoke

命令格式

revoke 权限 on 库.表 from 用户@主机;


revoke select on hr.* from zorro'localhost';
5. 远程主机授权
grant all on hr.* to zorro@'192.168.1.129' identified by '123';

grant all on hr.* to zorro@'%' identified by '123';


grant和revoke可在几个层次上控制访问权限

整个服务器 grant all 和 revoke all

整个数据库 on databases.*

grant select,insert on hr.* to robin@'localhost' identified by '123';

特定的表 on database.table;

grant select,insert on hr.tt to tom@'localhost' identified by '123';

其他方法:

mysql> INSERT INTO user (Host,User,Password)  VALUES('localhost','dummy',password());

mysql> FLUSH PRIVILEGES;

练习:

1.创建帐号zorro 允许从本机和任意位置登录

create user zorro@'%';

create user zorro@'%' identified by '123';

create user zorro@'localhost' identified by '123';
2.修改zorro名字为king
rename user zorro@'%' to king@'%';
rename user zorro@'localhost' to king@'localhost';
3.设置king用户的密码位123  
set password for king@'localhost'=password('123');
set password for king@'%'=password('123');
4.以king帐号登录到mysql数据库 设置密码位abc
set password=password('123');

2.重置root密码

1.停止mysql(pkill mysql)
2./usr/local/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables &
3.update mysql.user set password=password('123') where user='root' and host='localhost';
4.停止mysql   (pkill mysql)
5./usr/local/mysql/bin/mysqld_safe --user=mysql &
6.正常登录

跳过授权
vim /etc/my.cnf
[mysqld]
skip-grant-tables



用户信息mysql.user存储所有用户信息,权限信息分布不同的表中

abc1  abc2 abc3  abc4
grant all on *.* to abc1@localhost identified by '123';
abc1 权限保存在 mysql.user

grant all on robin.* to abc2@localhost identified by '123';
abc2 权限保存在 mysql.db

grant all on db.test20 to abc3@localhost identified by '123';
abc3 权限保存在 mysql.tables_priv

grant select(name) on db.test20 to abc4@localhost identified by '123';
abc4 权限保存在 mysql.columns_priv



\----------------------------------------------------------------------

create user robin;				添加帐号
set password for robin=password('123');		设置密码
create user zorro identified by '123';		创建帐号同时设置密码
rename user zorro to newzorro;			修改帐号名字
drop user newzorro;				删除帐号

set password=password('123');			设置当前帐号密码

root密码丢失
实验环境
删除数据目录
重新初始化
管理密码为空(直接登录)

重置root密码
/usr/local/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables &
--skip-grant-tables  跳过授权表不进行验证.
mysql> update mysql.user set password=password('123') where user='root' and host='localhost';  更新密码

pkill mysql
service mysqldd restart

授权
1.是否能连接数据库  localhost   %
2.验证帐号密码

1.能否连接数据库
第一部分 本地来源
第二部分 远程来源
create user zorro@'%' identified by '123';
select user,password,host from mysql.user;

create user zorro@'localhost' identified by '123';

2,授权
grant all on db.* to zorro@'localhost';     db库所有表具有所有权限
grant select,insert on db.t5 to robin@'localhost' identified by '123';  授权同时创建帐号

回收权限revoke all on db.* from zorro@'localhost';

  *.*     mysql.user
  db.*    mysql.db
  db.t5   mysql.tables_priv
  db.t5(id)	  mysql.columns_priv	


grant all on *.* to abc1@localhost identified by '123';
abc1 权限保存在 mysql.user

grant all on db.* to abc2@localhost identified by '123';
abc2 权限保存在 mysql.db

grant all on db.test20 to abc3@localhost identified by '123';
abc3 权限保存在 mysql.tables_priv

grant select(name) on db.test20 to abc4@localhost identified by '123';
abc4 权限保存在 mysql.columns_priv

7. 备份恢复

1. 备份

一般分为物理备份(物理文件)和逻辑备份(sql语句)

物理备份 只要备份物理文件 速度快不跨平台 linux windos

逻辑备份 sql语句的备份 速度慢 跨平台 linxu sql — > windos

还可以分为离线备份(物理)和在线备份(逻辑)

1. 物理备份

1.停掉数据库,cp相应的数据库目录或者表文件

myIsam引擎 备份表拷贝以下文件

tt.frm 表结构

tt.MYD 数据

tt.MYI 索引

innodb引擎 innodb hot backup收费199$ xtarbackup 免费

2. 物理备份

物理备份多种方式,

1.可以将数据文件拷贝到别的目录下,然后将数据目录删除。把拷贝的文间再拷贝回去。

2.将数据文件打成tar包到别的目录下,然后删除数据目录重新进行解压到数据目录下

3.做成lvm快照,进行恢复

关闭mysql

cp /usr/local/mysql/data/db/{t4.frm,t4.ibd} /backup/

cp /usr/local/mysql/data/ib* /backup/

drop table t4


恢复t4

cp /backup/t4.* /usr/local/mysql/data/db

chown mysql.mysql /usr/local/mysql/data/db/t4.*

cp /backup/ib* /usr/local/mysql/data/

/bin/cp /backup/ib* /usr/local/mysql/data/   覆盖掉

启动mysql

select * from db.t4;
              
ibdata1 数据

ib_logfile0\ 
	    > 事务信息
ib_logfile1/
3. 物理在线备份 myisam

1.锁定表 lock table t1 read;

2.cp 物理文件 备份

3.unlock tables;

工具mysqlhotcopy 适用于myIsam引擎 需要perl-DBD-MySQL包

/usr/local/mysql/bin/mysqlhotcopy -u root -p 123 -S /tmp/mysql.sock db /tmp/

ls /tmp/hr

vim /etc/my.cnf


[mysqlhotcopy]
socket=/tmp/mysql.sock
user=root
password=123

添加这个选项可以不进行账号密码登录,直接免密登录进去。
添加此选项不安全,容易被攻击,造成数据泄露等安全问题。
[mysql]
user=root
password=123
4. 练习

创建/mysql目录 mysqld进程产生的套接文件放到/mysql目录下 把mysql错误日志放到/mysql下

要求:mysql客户端可以直接链接mysql

mysqlhotcopy 可以直接连接

创建帐号king 可以修改mysql.user表的用户和host 查看权限对应表.删除king帐号

备份你的myfarm库(mysqlhotcopy)


逻辑备份 不区分引擎

mysqldump -u root -p123 --all-databases > /all.sql 全备

删掉data目录


初始化数据库(修改权限)

mysql -u root < all.sql

mysqldump -u root -p123 --databases db >> db.sql 备一个库

mysql -u root < db.sql


mysqldump -u root -p123 --databases testdb db > testdb.db.sql备多个库

mysql -u root < testdb.db.sql


mysqldump -u root -p123 db emp > emp.sql 备份表

mysql -u root -p123 db < emp.sql 恢复


5. 实验过程
1. 使用rpm源码安装的数据库
先做完全备份
[root@7-1 ~]# mkdir /backup
[root@7-1 ~]# mysqldump -u root -p123 --all-database  > /backup/all.sql

模拟损坏:
[root@7-1 ~]# rm -rf /usr/local/mysql/data

修复:

1.杀掉进程
pkill mysqld

2.创建目录data 修改拥有者和所属组 并且初始化
mkdir /usr/local/mysql/data
chown -R mysql.mysql /usr/local/mysql/
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data

3.启动mysql
systemctl restart mysqldd

4.修改密码
mysql -u root -p'密码'
set password='123';
5.恢复数据
mysql -uroot -p123 </backup/all.sql
2. 使用yum安装的数据库
先做完全备份
[root@7-1 ~]# mkdir /backup
[root@7-1 ~]# mysqldump -u root -p123 --all-database  > /backup/all.sql

模拟损坏:
[root@7-1 ~]# rm -rf /var/lib/mysql
傻屌进程
[root@7-1 ~]# pkill mysqld
[root@7-1 ~]# mkdir /var/lib/mysql
[root@7-1 ~]# chown -R mysql.mysql /var/lib/mysql

重新启动服务
[root@7-1 ~]# systemctl restart mysqld

查看初始密码
[root@7-1 ~]# cat /var/log/mysql.log

使用初始密码进行登录
[root@7-1 ~]# mysql -u root -p'初始密码'

重新修改密码
[root@7-1 ~]# set password=password('密码')

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

数据恢复
[root@7-1 ~]# mysql -uroot -p'Robin_123' < /backup/all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

mysql> 

2. 导入导出

show global variables like '%secure%';

• 当secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
• 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
• 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

/etc/my.cnf
secure_file_priv =  

表的导出和导入

[root@7-1 backup]# cat t1.txt
2,robin
3,zorro
1,trro
5,fdsa
6,fdsacvxz

mysql> select * from t1;                                                                            
+------+----------+
| id   | name     |
+------+----------+
|    2 | robin    |
|    3 | zorro    |
|    1 | trro     |
|    5 | fdsa     |
|    6 | fdsacvxz |
+------+----------+
5 rows in set (0.00 sec)

mysql> select * from t9 into outfile '/backup/a.txt';

mysql> load data infile '/backup/t1.txt' into table t1 fields terminated by ',' lines terminated by '\n' ;
Query OK, 5 rows affected (0.00 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from t1;                                                                            
+------+----------+
| id   | name     |
+------+----------+
|    2 | robin    |
|    3 | zorro    |
|    1 | trro     |
|    5 | fdsa     |
|    6 | fdsacvxz |
|    2 | robin    |
|    3 | zorro    |
|    1 | trro     |
|    5 | fdsa     |
|    6 | fdsacvxz |
+------+----------+
10 rows in set (0.00 sec)



从外边导入到数据库
mysql> load data infile '/backup/t1.txt' into table t1 fields terminated by '\t' lines terminated by '\n' ;
mysql> select * from t9;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    1 | aa   |
|    1 | aa   |
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
+------+------+


从数据库里面向外导出数据
指定列分隔符和行分隔符
mysql> select * from t1;                                                                            
+------+----------+
| id   | name     |
+------+----------+
|    2 | robin    |
|    3 | zorro    |
|    1 | trro     |
|    5 | fdsa     |
|    6 | fdsacvxz |
+------+----------+
5 rows in set (0.00 sec)

select * from t1 into outfile '/backup/t1.txt' fields terminated by ',' lines terminated by '\n';

[root@7-1 backup]# cat t1.txt
2,robin
3,zorro
1,trro
5,fdsa
6,fdsacvxz

3. lvm的快照(mysql备份)

1.将lv挂载mysql数据目录data

2.保证数据完整(全备 完全恢复)

3.锁库

mysql> FLUSH TABLES WITH READ LOCK;

4.创建快照

[root@robin data]# lvcreate -L 300M -s -n /dev/vgmysql/lvmysql-snampshot  /dev/vgmysql/lvmysql

5.解锁

mysql> unlock tables;

6.备份

mount /dev/vgmysql/lvmysql-snampshot /opt

[root@robin opt]# tar -cvf /backup/mysql.bak.tar /opt/*

7.删除快照

[root@robin /]# umount /opt/

[root@robin /]# lvremove /dev/vgmysql/lvmysql-snampshot

8.恢复

1.确定mysql进程结束

[root@robin backup]# killall -9 mysqld

2.解压恢复

[root@robin backup]# tar -xvf /backup/mysql.bak.tar -C /usr/local/mysql/data/

1.锁表(时间不好估算)

2.快照大小

3.不能使用xfs文件系统 使用ext4格式文件系统。

使用脚本进行备份

前提,做好逻辑卷

#!/bin/bash

mysqlj -u root -p123 'FLUSH TABLES WITH READ LOCK; system  lvcreate -L 300M -s -n /dev/vgmysql/lvmysql-snampshot  /dev/vgmysql/lvmysql;unlock tables;'
mount /dev/vgmysql/lvmysql-snampshot /opt
cd /opt
tar -cvf /backup/mysql.bak.tar ./*
cd
umount /opt/
lvremove /dev/vgmysql/lvmysql-snampshot

4. 二进制日志的使用log-bin

binlog日志是把数据库的每一个变化都记载到一个专用的文件里,这种文件叫日志文件,mysql默认

只打开错误日志文件,因为过多的日志会影响系统的处理性能

1. 启用方法
临时启用
1.mysqld_safe --log-bin --user=mysql&


永久启用
2.vim /etc/my.cnf

[mysqld]
server-id=1

log-bin=master          日志名称

log-bin-index=master    日志索引

max-binlog-size=        防止binlog大小


查看是否启动了binlog日志

mysql> set binlog_rows_query_log_events=1;

show binlog events \G

*************************** 1. row ***************************
   Log_name: 131-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 106
       Info: Server ver: 5.1.34-log, Binlog ver: 4
1 row in set (0.00 sec)


查询第二个binlog日志

show binlog events in '131-bin.000002';

binlog文件存储位置/usr/local/mysql/var/

131-bin.000001 binlog日志

131-bin.index 记录binlog的文件个数以及名字

2.binlog日志的模式

查看binlog文件内容

mysqlbinlog -v /usr/local/mysql/var/master.000001

切换日志 (重新启动会产生新日志 mysqladmin flush-logs)


mysql>flush logs
mysqladmin -u root -p123 flush-logs

1、Statement Level模式(早期默认)

​ 简介:每一条会修改数据的sql都会记录到master的bin-log中。Slave在复制的时候sql线程会

解析成和原来master端执行过的相同语句来执行。

​ 优点:不需要记录每一行数据的变化,减少bin-log的日志量,节约IO,提高性能。因为他只记录在master上所执行语句的细节,以及执行语句时候的上下文的信息。

​ 缺点:很多新功能的加入在复制的时候容易导致出现问题。

查询日志状态
mysql中
mysql> show binlog events\G

mysql中显示语句
mysql> set binlog_rows_query_log_events=1;

系统中
[root@localhost data]# mysqlbinlog -v /usr/local/mysql/data/mysql.000001
-v 显示具体语句信息

2、Row Level 模式:

​ 简介:日志中会记录成每一行数据被修改的模式,然后再slave 端在对相同的数据进行修改.

​ 优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息。仅仅只

需要记录那一条记录被修改了。所以row level的日志内容会非常清楚记录下每一行数据修改的细

节,非常容易理解。而且不会出现某些特点情况下的存储过程,或function 以及triggeer的调用

和触发无法被正确复制的问题.

​ 缺点:所有执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,可能会产生大量的日志呢。

delete from t1;
mysql> show global variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+

系统查看日志信息
[root@localhost data]# mysqlbinlog -v /usr/local/mysql/data/mysql.000001
mysql中查看语句
mysql> set binlog_rows_query_log_events=1;
mysql> show binlog events\G
*************************** 10. row ***************************
   Log_name: mysql.000001
        Pos: 574
 Event_type: Rows_query
  Server_id: 1
End_log_pos: 653
       Info: # insert into t10 values(1,'robin'),(2,'zorro'),(3,'tom')
*************************** 11. row ***************************

3、Mixed (前两种的混合模式):

​ 根据执行的每一条具体的sql语句来区分对待记录日志的形式;

使用binlog恢复

​ 如果遇到灾难事件,应该使用最近一次制作的完整备份恢复数据库,然后使用备份之后的日志文件

​ 将数据库恢复到最接近现在的可用状态.

如何设置模式:
[mysqld]
innodb_file_per_table=1
secure_file_priv =
server-id=1
log_bin=mysql
log_bin_index=mysql
binlog_format={statement|row|mixed}


binlog日志的切换
情况1:
mysqld服务重新启动
情况2:
mysql> flush logs;
情况3:
[root@localhost data]# mysqladmin -u root -p123 'flush-logs'


查看其他日志
mysql> show binlog events in "mysql.000003"\G

使用日志恢复时,应依次进行,即最早生成的日志文件最先恢复:

mysqlbinlog master-bin.000001 | mysql -u root -p123

mysqlbinlog master-bin.000002 | mysql -u root -p123

mysqlbinlog master-bin.000001 master-bin.000002 |mysql

mysqlbinlog `cat master-bin.index` | mysql

如果在日志内有错误,我们可以根据日志里的时间进行部分恢复;

 mysqlbinlog --stop-datetime='2012-03-22 23:20:44' master-bin.000004 | mysql

根据binlog日志里的字节数进行恢复


mysqlbinlog --stop-position=274 master-bin.000004 | mysql

使用binlog-do-db可以指定记录的数据库;

使用binlog-ignore-db可以指定不记录的数据库。

注意的是:

binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个

语句。而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,

否则不会起作用。

3. 数据库全备实验
1. 数据库全备
数据库全备
1.开启binlog日志  将binlog和binglog索引文件  放到/backup下
2.创建库 创建表
3.刷新日志 flush logs
4.插入数据 
5.物理删除库


恢复
1.杀mysql进程(关闭2进制binlog)
2.初始化数据库
3.恢复全备
4.恢复binlog日志,删除已有日志
5.打开binlog
2. 实验环境
1.完整数据
2.开启binlog日志
3.创建库 创建表
4.插入数据 2条数据  删除所有数据  再插入两条数据
5.切换日志
6.删除所有数据  插入3条数据
7.删除表
8.rm -rf /usr/local/mysql/data/*

要求:
恢复所有删除数据

1.关闭binlog
2.杀进程
3.初始化
4.启动mysql
5.恢复全备
6.恢复binlog

mysqlbinlog --start-position=1035  /backup/master.000001 | mysql -u root -p123

mysqlbinlog --start-datetime='2015-08-21 15:50:21'  --stop-datetime='2015-08-21 15:50:32' /backup/master.000002 | mysql -u root -p123
3. 练习
1.创建两张表
a.book_type
    杂文
    散文
    小说
b.book
外键 
创建一个试图view  类型  书名

2.创建3个基表 a  b  c 结构相同 
将3张表融合 mrg_myisam
   

3.创建mysql中创建帐号robin
创建库db10 创建表test1
授权robin帐号可以增删改查test1表  不许使用grant命令
update
flush privileges

4.使用lvm快照方式备份mysql全备  并且测试恢复  并且写成脚本

5.使用mysqldump方式备份数据库
a.全备  完全恢复 
b.备份  robin表  删除robin表  恢复robin

写一个交互式脚本完成备份操作 
4. binlog日志的使用
1.开启binlog日志
vim /etc/my.cnf
[mysqld]
server-id=1    服务器编号
log-bin=master 日志名称
log-bin-index=master  日志索引

5. 模拟恢复

日志和数据分离

[root@7-1 ~]# vim /etc/my.cnf
[mysqld]
innodb_file_per_table=1
secure_file_priv =
server-id=1
log_bin=/mysql-log/master
log_bin_index=/mysql-log/master
binlog_format=row
log-error=/mysql-log/localhost.err

[root@localhost data]# mkdir /mysql_log
[root@localhost data]# chown -R mysql.mysql /mysql_log
1. 物理删除
1.完全备份做好
2. 开启binglog日志
[mysqld]
server-id=1

log-bin=master          日志名称

log-bin-index=master    日志索引

max-binlog-size=        防止binlog大小


创建数据库zorro
   创建表t1
   插入数据3条
   flush logs;
   插入数据2条
   flush logs;

mysql> create database hello
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| hello              |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
7 rows in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> create database world;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

Query OK, 1 row affected (0.02 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> use world;
Database changed
mysql> create table t1(id int,name char(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> show binlog events\G
*************************** 1. row ***************************
   Log_name: binlog.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.28-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: binlog.000001
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info: 
*************************** 3. row ***************************
   Log_name: binlog.000001
        Pos: 154
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: binlog.000001
        Pos: 219
 Event_type: Query
  Server_id: 1
End_log_pos: 316
       Info: create database world
*************************** 5. row ***************************
   Log_name: binlog.000001
        Pos: 316
 Event_type: Rotate
  Server_id: 1
End_log_pos: 360
       Info: binlog.000002;pos=4
5 rows in set (0.00 sec)


3. 模拟错误
rm -rf /usr/local/mysql/data/*
4. 恢复
1.恢复全备

2.停止mysql进程 

[root@7-1 mysql]# pkill mysqld

3.关闭binlog日志

[root@localhost data]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data
打开配置文件/etc/my.cnf把binlog注释掉

4.登录并修改秘密(默认密码来自日志文件)
mysql> set password=password("Robin_123");

6.恢复all.sql
[root@localhost data]# mysql -u root -pRobin_123 < /backup/all.sql
[root@localhost data]# systemctl restart mysqldd

7.binlog日志恢复数据
[root@localhost binlog]# mysqlbinlog /binlog/master.000001 | mysql -u root -p123 
[root@localhost binlog]# mysqlbinlog /binlog/master.000002 | mysql -u root -p123 
[root@localhost binlog]# mysqlbinlog /binlog/master.000003 | mysql -u root -p123 

8.确认恢复成功
9.打开binlog,正常运行

[root@7-1 mysql]# cd ..
[root@7-1 lib]# rm -rf /var/lib/mysql
[root@7-1 lib]# mysql -uroot -p'Robin_123' < /backup/all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@7-1 lib]# mysqlbinlog /backup/binlog.000002 | mysql -u root -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1049 (42000) at line 19: Unknown database 'world'
[root@7-1 lib]# mysqlbinlog /backup/binlog.000001 | mysql -u root -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@7-1 lib]# mysqlbinlog /backup/binlog.000002 | mysql -u root -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@7-1 lib]# mysqlbinlog /backup/binlog.000003 | mysql -u root -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@7-1 lib]# 
2. 逻辑删除
1.完全备份做好
2.开启binglog日志
创建数据库hello
   创建表world
   插入数据3条
   删除2条数据
   flush logs;
   删除所有数据
   插入数据2条
   删除1条数据 
   flush logs;
   插入2条数据
   
mysql> create database woc;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: world

Query OK, 1 row affected (0.01 sec)

mysql> use woc;
Database changed
mysql> create table woc1(id int,name char(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into woc1 values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> insert into woc1 values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from woc1 where id=1 or id=2;
Query OK, 2 rows affected (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from woc1
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into woc1 values(3,'tom');
Query OK, 1 row affected (0.00 sec)

mysql> insert into woc1 values(4,'jerry');
Query OK, 1 row affected (0.00 sec)

mysql> delete from woc1 where id=3;
Query OK, 1 row affected (0.01 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into woc1 values(5,'jack');
Query OK, 1 row affected (0.00 sec)

mysql> insert into woc1 values(6,'rose');
Query OK, 1 row affected (0.00 sec)

mysql> 

mysql> select * from woc1;
+------+-------+
| id   | name  |
+------+-------+
|    4 | jerry |
|    5 | jack  |
|    6 | rose  |
+------+-------+
3 rows in set (0.00 sec)
3. 完全恢复
恢复所有插入数据

根据时间或者编号进行恢复插入的数据
[root@localhost binlog]# mysqlbinlog --stop-position=1486 master.000001  | mysql -u root -p123
[root@localhost binlog]# mysqlbinlog --start-datetime="2018-04-24 14:52:28" master.000002  | mysql -u root -p123


停止mysql进程 
关闭binlog日志
[root@localhost data]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data

or
[root@localhost ~]# systemctl restart mysqld

登录并修改秘密(默认密码来自日志文件)
mysql> set password=password("Robin_123");

恢复all.sql
[root@localhost data]# mysql -u root -pRobin_123 < /backup/all.sql
[root@localhost data]# systemctl restart mysqldd

恢复数据
[root@localhost binlog]# mysqlbinlog --stop-position=1486 master.000001  | mysql -u root -p123
[root@localhost binlog]# mysqlbinlog --start-datetime="2018-04-24 14:52:28" master.000002  | mysql -u root -p123
[root@localhost binlog]# mysqlbinlog master.000003  | mysql -u root -p123

根据时间或者是编号一条条数据恢复

8. MySQLAB复制

1. MySQLAB复制

1. MySQLAB复制简介

​ AB复制又称主从复制,实现的是数据同步。如果要做MySQL AB复制,数据库版本尽量保持一致。如果版本不一致,从服务器版本高于

主服务器,但是版本不一致不能做双向复制。MySQL AB复制有什么好处呢?有两点,第一是解决宕机带来的数据不一致,因为MySQL

AB复制可以实时备份数据;第二点是减轻数据库服务器压力,这点很容易想到,多台服务器的性能一般比单台要好。但是MySQL AB复制

不适用于大数据量,如果是大数据环境,推荐使用集群。

​ Mysql复制(replication)是一个异步的复制,从一个Mysql 实例(Master)复制到另一个Mysql 实例(Slave)。实现整个主从复

制,需要由Master服务器上的IO进程,和Slave服务器上的Sql进程和IO进程共从完成。要实现主从复制,首先必须打开Master端的

binary log(bin-log)功能,因为整个 MySQL 复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全

顺序的执行日志中所记录的各种操作。(二进制日志几乎记录了除select以外的所有针对数据库的sql操作语句)

2. 主从复制的基本过程

1)、Mysql Slave端的IO进程连接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2)、Master接收到来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。

并将本次请求读取的bin-log文件名及位置一起返回给Slave端。

3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log

的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的

日志内容,请发给我”;

4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

在每次进行操作之前做以下操作:

1.设置主机名

2.彼此解析主机名

3.关闭防火墙

4.selinux关闭

5.设置时间同步

清除slave或者master配置使用 reset slave/master all

1. 主服务器

A全备份

A ip  192.168.43.134

1.A全备份

mysqldump -u root -S /var/lib/mysql/mysql.sock --all-databases >> /tmp/all.sql

将全备拷贝到从机,并且从机恢复数据

2.开启binlog日志

vim /etc/my.cnf
[mysqld]
log-bin=master
log-bin-index=master
server-id=1

service mysqld restart

3.授权B服务器 可以传输binlog日志

grant replication slave on *.* to slave@'192.168.43.133' identified by 'Robin_123';


2. 从服务器

从服务器



源码方式安装的没有此目录和用户,需要手动创建目录 组 用户才可继续操作
使用yum方式安装的不需要进行以下操作,因为创建启动就已经存在该目录 组 用户。


groupadd -g 27 mysql
useradd -g 27 -u 27 -s /bin/nologin mysql
mkdir /var/lib/mysql
chown -R mysql.mysql  /var/lib/mysql

B

B ip  192.168.43.133


1.测试slave是否能正常链接
mysql -u slave -pRobin_123 -h 192.168.43.134

[root@7-2 ~]# mysql -u slave -pRobin_123 -h 192.168.43.134
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)


2.拷贝A服务器的全备,并且恢复

先安装数据库
[root@7-1 mysql]# ls
mysql-5.7.25.tar.gz  mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
[root@7-1 mysql]# scp mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar 192.168.43.133:/root/
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar                      100%  581MB  12.1MB/s   00:47 

[root@7-2 ~]# mkdir /var/mysql
[root@7-2 ~]# mv mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar /var/mysql/
[root@7-2 ~]# cd /var/mysql/
[root@7-2 mysql]# ls
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
[root@7-2 mysql]# tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar 

[root@7-2 yum.repos.d]# yum -y install /var/mysql/mysql-community-*


将全备数据库的文件拷贝到slave上
[root@7-1 backup]# scp all2.sql 192.168.43.133:/backup/
all2.sql                                                      100%  858KB  18.5MB/s   00:00    
[root@7-1 backup]# 

[root@7-2 backup]# mysql -u root -pRobin_123 < /backup/all2.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

[root@7-2 backup]# mysql -u root -pRobin_123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
| woc                |
| world              |
+--------------------+
8 rows in set (0.00 sec)

当使用全备恢复时,数据库的密码会变成A上数据库的密码。
之前设置B的root密码为Robin_123 全备后的数据库的密码是A上的root账号的密码123


3.配置A服务器连接地址及用户信息

修改B的配置文件中的server-id添加,A为1则B不能为1,B可以使用任何数字
vim /etc/my.cnf
[mysqld]
server-id=2

修改的是B的配置,进入数据库修改。
mysql -u root -p123
mysql> stop slave;
mysql> change master to
-> master_host='172.16.10.1',
-> master_user='slave',
-> master_password='Robin_123',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=‘’
mysql> start slave;

change master to master_host='192.168.43.134',master_user='slave',master_password='Robin_123',master_port=3306,master_log_file='master.000001',master_log_pos=154;

注意事项:
当change master to输入时要记住使用的密码并不是root的密码,而是一开始的从A服务器上的授权的slave用户的密码。如果此处输入错误,则会一直显示Slave_IO_Running: Connecting

测试

A服务器
mysql> show master status\G

mysql> show master status\G
*************************** 1. row ***************************
             File: master.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)




B服务器
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.134
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 451
               Relay_Log_File: 7-2-relay-bin.000002
                Relay_Log_Pos: 614
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 451
              Relay_Log_Space: 819
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: b4a4ca84-2969-11eb-a6f4-000c2944503d
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> 


A服务器做出数据改动 查看从服务器是否有同步的变化

练习:

主----从()------从
log-slave-updates 中间这台作用:中继日志内容写入到binlog日志

Binlog_Do_DB=robin
Binlog_Ignore_DB=db
binlog_ignore_db=test

2. M-M互为主从

互为主从就是在主服务器上授权,配置从服务器。然后再把从服务器当作主服务器,配置从服务器(之前的主服务器)。

主服务器

开启binlog日志

[mysqld]
log-bin=master
log-bin-index=master
server-id=1

1.全备

[root@localhost data]# mysqldump -u root -p123 --all-databases > /tmp/all.sql

2.将全备拷贝给从机,并在从机完全恢复,保证主从数据的一致性

3.授权从机可以从主机复制数据

mysql> grant replication slave on *.* to slave@'192.168.10.201' identified by '123';

4.查看主服务器日志状态

mysql> show master status\G
*************************** 1. row ***************************
             File: master.000001
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

从服务器

1.完全恢复

[root@localhost mysql]# mysql -u root < /root/all.sql

2.测试登陆主服务器

[root@localhost mysql]# mysql -u slave -p123 -h 192.168.43.134

3.配置文件

[root@localhost data]# cat /etc/my.cnf 
[mysqld]
server-id=2

4.配置连接服务器

mysql> change master to
    -> master_host='192.168.43.134',
    -> master_user='slave',
    -> master_password='Robin_123',
    -> master_log_file='master.000001',
    -> master_log_pos=120;
    
mysql> start slave;

mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

**调换两台主机的身份再做一次=============**

从服务器

开启binlog日志

[root@7-2 backup]# vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=slave
log-bin-index=slave

[root@7-2 backup]# systemctl restart mysqld

给主服务器授权

mysql> grant replication slave on *.* to master@'192.168.43.133' identified by 'Robin_123' ;

主服务器

mysql> change master to
    -> master_host='192.168.43.133',
    -> master_user='master',
    -> master_password='Robin_123',
    -> master_log_file='slave.000001',
    -> master_log_pos=452;

mysql> start slave;
mysql> show slave status\G

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.133
                  Master_User: master
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: slave.000001
          Read_Master_Log_Pos: 452
               Relay_Log_File: 7-1-relay-bin.000002
                Relay_Log_Pos: 316
        Relay_Master_Log_File: slave.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

测试

change master to master_host='172.16.60.246',master_user='slave',master_password='123',master_port=3306,master_log_file='master.000003',master_log_pos=312;

3. Keepalived+MySQL互主

keepalived是什么

keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障(HA)

keepalived工作原理

​ keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即[虚拟路由冗。

​ 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器

组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网

内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时

就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启

动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实

现VRRP协议的。

在mysql互主的基础上配置keepalived(两台mysql都要安装)

root@localhost smb]# tar -xvf keepalived-1.2.24.tar.gz -C /usr/local/src/
[root@localhost ~]# cd /usr/local/src/keepalived-1.2.24/
[root@localhost keepalived-1.2.24]#./configure --prefix=/ --mandir=/usr/local/share/man/
[root@localhost keepalived-1.2.24]# make
[root@localhost keepalived-1.2.24]# make install
[root@localhost keepalived-1.2.24]# cd /etc/keepalived/
! Configuration File for keepalived

global_defs {                                           #全局定义主要设置 keepalived 的通知机制和标识
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id test
}

vrrp_instance VI_1 {                    #VRRP(虚拟路由冗余协议)实例配置
    state MASTER                            #另一个 Director 标记为 BACKUP!!!
    interface eth0                              #实例绑定的网卡
    virtual_router_id 51                    #VRID 虚拟路由标识 00-00-5e-00-01-{VRID}
    priority 150                                    #优先级高为master,master 至少要高于 backup 50 !!!
    advert_int 1                                    #检查间隔
    authentication {
        auth_type PASS                          验证:主备之间做身份验证  主备之间一定一致
        auth_pass 1111
    }
    virtual_ipaddress {                         浮动ip
        192.168.10.222/24
    }
}

[root@localhost keepalived]# scp keepalived.conf 192.168.10.201:/etc/keepalived/
拷贝后,修改配置文件
	state BACKUP
	priority 100

2台mysql上,启动Keepalived服务
[root@localhost keepalived]# service keepalived start



测试2台mysql的故障转移

4. MySQL AB复制的半同步

Mysql 主从复制(半同步)

1. 半同步复制

​ 在说明半同步复制之前我们先来了解一下,什么是同步复制?同步复制:同步复制可以定义为数据在同一时

刻被提交到一台或多台机器,通常这是通过众所周知的“两阶段提交”做到的。虽然这确实给你在多系统中保持

一致性,但也由于增加了额外的消息交换而造成性能下降。使用MyISAM或者InnoDB存储引擎的MySQL本身

并不支持同步复制,然而有些技术,例如分布式复制块设备(简称DRBD),可以在下层的文件系统提供同步

复制,允许第二个MySQL服务器在主服务器丢失的情况下接管(使用第二服务器的复本)。了解了同步复制

我们正下面来说一下,什么是半同步复制?

​ MYSQL 5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库

在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例

如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提

供数据一致的服务了。Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了

至少一个备库。Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行

完成了。

​ 此外,还有一种情况会导致主备数据不一致。在某个session中,主库上提交一个事务后,会等待事务传递

给至少一个备库,如果在这个等待过程中主库Crash,那么也可能备库和主库不一致,这是很致命的。如果主

备网络故障或者备库挂了,主库在事务提交后等待10秒(rpl_semi_sync_master_timeout的默认值)后,就

会继续。这时,主库就会变回原来的异步状态。

MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事

务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。

2. 异步与半同步异同

​ 默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复

制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,

甚至可能丢失数据。

​ MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整

的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台slave追赶上之后,继续切换

到半同步模式。

注:mysql5.5半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是master用的

semisync_master.so,一个是slave用的semisync_slave.so,下面我们就来具体配置一下。

3. 配置(先做AB异步复制,再改成半同步)

1. master端

安装半同步master插件

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

开启半同步插件

mysql> set global rpl_semi_sync_master_enabled=1;

设置同步超时时间

mysql> set global rpl_semi_sync_master_timeout=1000;

修改配置文件

[root@localhost data]# cat /etc/my.cnf
[mysqld]
server-id=1
log-bin=master
log-bin-index=master
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

启动服务

systemctl restart mysqld

2. slave端配置

安装半同步slave插件

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

开启半同步插件

mysql> set global rpl_semi_sync_slave_enabled=1;

修改配置文件

[root@localhost data]# cat /etc/my.cnf 
[mysqld]
server-id=2
rpl_semi_sync_slave_enabled=1

重新启动服务

[root@7-2 backup]# systemctl restart mysqld
4. 查询状态

master

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

slave

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)
5. 测试

1. master

mysql> create table test(id int);
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+--------------+
| Tables_in_db |
+--------------+
| t1           |
| test         |
+--------------+
2 rows in set (0.00 sec)

mysql> insert into test values(1),(2);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

模拟错误

2. slave

mysql> STOP SLAVE IO_THREAD; 
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

master

mysql> create table user1 (id int(10)); 
Query OK, 0 rows affected (1.02 sec)
创建时间会变长


只是第一次的时候时间会长,之后每次创建时时间都会缩短。

5. GTID复制

1. GTID概念介绍

​ GTID即全局事务ID (global transaction identifier), 其保证为每一个在主上提交的事务在复制集群中可以生

成一个唯一的ID。GTID最初由google实现,官方MySQL在5.6才加入该功能。mysql主从结构在一主一从情况

下对于GTID来说就没有优势了,而对于2台主以上的结构优势异常明显,可以在数据不丢失的情况下切换新

主。

​ 使用GTID需要注意: 在构建主从复制之前,在一台将成为主的实例上进行一些操作(如数据清理等),通过

GTID复制,这些在主从成立之前的操作也会被复制到从服务器上,引起复制失败。也就是说通过GTID复制都

是从最先开始的事务日志开始,即使这些操作在复制之前执行。比如在server1上执行一些drop、delete的清

理操作,接着在server2上执行change的操作,会使得server2也进行server1的清理操作。

​ GTID实际上是由UUID+TID (即transactionId)组成的。其中UUID(即server_uuid) 产生于auto.conf文件(cat

/data/mysql/data/auto.cnf),是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并

且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且

会补全没有执行的事务)。GTID在一组复制中,全局唯一。

2. GTID的组成

GTID = source_id:transaction_id

source_id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可

以理解为源ID。

transaction_id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事

务。

示例:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为

transaction_id

3. GTID的工作原理

1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。

2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉

Slave,下一个要执行的GTID值。

3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。

4、如果有记录,说明该GTID的事务已经执行,slave会忽略。

5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,

​ 在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。

6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

4. 相关配置

1、主 master

[mysqld] 
*#GTID:* 
server_id=135                *#服务器id* 
gtid_mode=on                 *#开启gtid模式* 
enforce_gtid_consistency=on  *#强制gtid一致性,开启后对于特定create table不被支持*  
*#binlog* 
log_bin=master-binlog 
log-slave-updates=1     
binlog_format=row            *#强烈建议,其他格式可能造成数据不一致*

2.、从 slave

[mysqld] *#GTID:* 
gtid_mode=on 
enforce_gtid_consistency=on 
server_id=143  
*#binlog* 
log-bin=slave-binlog 
log-slave-updates=1
binlog_format=row      *#强烈建议,其他格式可能造成数据不一致*  
\#*relay log* 
skip_slave_start=1
【注】
当配置没用成功是显示connecting时,说明写入的slave密码写错了。打开配置件/var/lib/mysql/master.info

查看之前写入的slave账号密码是否正确,如有错误修改保存后重启以root用户身份登陆show slave status\G查
看两个是否都为yes

9.多源复制

1. 使用多源复制的考虑

1、灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了),还有最后一个救命稻草;

2、备份:直接在这个从库中做备份,不影响线上的数据库;

3、减少成本:不需要每个库都做一个实例,也减少了DBA的维护成本;

4、数据统计:后期的一些数据统计,需要将所有的库汇总在一起。

2. 实验环境

1.关闭防火墙

2.关闭selinux

3.设置和解析主机名

192.168.0.13 master1.com
192.168.0.14 master2.com
192.168.0.11 slave.com

4.分别安装mysql5.7

5.分别在master1 master2上建立不同的数据库已做测试

master1
mysql> create database test;
mysql> use test
mysql> create table test(name char(10));
mysql> insert into test values('robin');
mysql> insert into test values('zorro');


master2
mysql> create database db;
mysql> use db
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);

6.分别在master1 master2导出需要同步的数据库

master1
mysqldump -u root -pRobin_123 --databases test > /tmp/test.sql


master2
mysqldump -u root -pRobin_123 --databases db > /tmp/db.sql


7.分别在master1 master2上创建复制账号和密码

master1
grant replication slave on *.* to [email protected] identified by "Slave_123";


master2
grant replication slave on *.* to [email protected] identified by "Slave_123";

8.在slave节点测试

[root@web1 conf]# mysql -u slave1 -pSlave_123 -h 192.168.0.13
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 33
Server version: 5.7.18-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

[root@web1 conf]# mysql -u slave2 -pSlave_123 -h 192.168.0.14
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

9.修改

master_info_repository=TABLE
relay_log_info_repository=TABLE

master_info_repository

开启MTS功能后,务必将参数master_info_repostitory设置为TABL,这样性能可以有50%~80%的提升。这是

因为并行复制开启后对于元master.info这个文件的更新将会大幅提升,资源的竞争也会变大。在之InnoSQL

的版本中,添加了参数来控制刷新master.info这个文件的频率,甚至可以不刷新这个文件。因为刷新这个文件是没有必要的,即根据master-info.log这个文件恢复本身就是不可靠的。

在MySQL 5.7中,推荐master_info_repository设置为TABLE,来减少这部分的开销。

relay_log_info_repository 同理

vim /etc/my.cnf
master_info_repository=TABLE
relay_log_info_repository=TABLE

也可以在线修改
mysql> stop slave;
mysql> SET GLOBAL master_info_repository = 'TABLE';
mysql> SET GLOBAL relay_log_info_repository = 'TABLE';


10.将master1 master2备份的sql语句拷贝并导入slave数据库拷贝

[root@web1 conf]# scp 192.168.0.13:/tmp/test.sql /tmp/
test.sql                                                   100% 1937     1.9KB/s   00:00    
[root@web1 conf]# scp 192.168.0.14:/tmp/db.sql /tmp/
db.sql                                                     100% 1898     1.9KB/s   00:00  

11.恢复

[root@web1 conf]# mysql -u root -pRobin_123 < /tmp/test.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@web1 conf]# mysql -u root -pRobin_123 < /tmp/db.sql 
mysql: [Warning] Using a password on the command line interface can be insecure
  1. 分别找出master1 和master2的pos位置
master1
mysql> show master status\G
*************************** 1. row ***************************
             File: master1.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)


master2
mysql> show master status\G
*************************** 1. row ***************************
             File: master2.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

slave

登录Slave进行同步操作,分别change master到两台Master服务器,后面以FORCHANNEL'CHANNEL_NAME'区分

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.13',MASTER_USER='slave1', MASTER_PASSWORD='Slave_123',MASTER_LOG_FILE='master1.000001',MASTER_LOG_POS=154 FOR CHANNEL 'master1';
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.14',MASTER_USER='slave2', MASTER_PASSWORD='Slave_123',MASTER_LOG_FILE='master2.000001',MASTER_LOG_POS=154 FOR CHANNEL 'master2';
Query OK, 0 rows affected, 2 warnings (0.02 sec)


正常启动后,可以查看同步的状态:执行SHOW SLAVE STATUS FOR CHANNEL 'channel_name'\G

验证数据是否同步

master1
insert into test values('king');

master2
insert into t1 values('10000');

slave
mysql> select * from test.test;
+-------+
| name  |
+-------+
| robin |
| zorro |
| king  |
+-------+
3 rows in set (0.01 sec)

mysql> select * from db.t1;
+-------+
| id    |
+-------+
|   100 |
|   200 |
| 10000 |
+-------+
3 rows in set (0.00 sec)

10. MyCat

1. MyCat实现读写分离

准备三台虚拟机

1.关闭防火墙
2.关闭selinux

3.设置主机名和ip地址

vm-1 mycat.com 192.168.43.138
vm-2 mysql-a.com 192.168.43.139 读服务器
vm-3 mysql-b.com 192.168.43.140 写服务器

在mysql-a 和 mysql-b 主机上安装好mysql并创建好测试读写分离的库和表

一、下载mycat

mycat的官网网址 http://www.mycat.org.cn/,我使用的是mycat的1.6的Linux安装包
下载地址
https://github.com/MyCATApache/Mycat-download-new
下载mycat的安装包到 /tmp 目录下

root@mycat ~]# ls
anaconda-ks.cfg       jdk-8u144-linux-x64.tar.gz                             mysql-init.sh
initial-setup-ks.cfg  Mycat-server-1.6.7.6-test-20201120140934-linux.tar.gz
[root@mycat ~]# tar -xvf Mycat-server-1.6.7.6-test-20201120140934-linux.tar.gz -C /usr/local/
[root@mycat ~]# ls -d /usr/local/mycat/
/usr/local/mycat/
[root@mycat ~]# cd /usr/local/mycat/
[root@mycat mycat]# ls
bin  catlet  conf  lib  logs  version.txt
二、安装JDK并且配置环境变量

下载tmp/jdk-8u131-linux-x64.tar.gz

[root@mycat ~]# tar -xvf jdk-8u144-linux-x64.tar.gz -C /usr/local/
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_131/ /usr/local/java

# 配置环境变量
[root@mycat ~]# tail -3 /etc/profile
[root@mycat ~]# vim /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH

# 重新加载
[root@mycat ~]# source /etc/profile
[root@mycat ~]# env | grep JAVA
JAVA_HOME=/usr/local/jdk1.8.0_144
三、修改mycat配置文件

接下来修改mycat的配置文件

[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# ls

autopartition-long.txt       migrateTables.properties              sequence_http_conf.properties
auto-sharding-long.txt       myid.properties                       sequence_time_conf.properties
auto-sharding-rang-mod.txt   partition-hash-int.txt                server.xml
cacheservice.properties      partition-range-mod.txt               server.xml.bak
dbseq.sql                    rule.xml                              sharding-by-enum.txt
dbseq - utf8mb4.sql          schema.xml                            wrapper.conf
dnindex.properties           schema.xml.bak                        zkconf
ehcache.xml                  sequence_conf.properties              zkdownload
index_to_charset.properties  sequence_db_conf.properties
log4j2.xml                   sequence_distributed_conf.properties
注:

配置文件非常多,配置项也远比amoeba复杂.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件[server](http://javascript:;).xml 和 schema.xml

(一)先配置server.xml

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml 找到这一段

<user name="test" defaultAccount="true">
                <property name="password">testproperty>
                <property name="schemas">TESTDBproperty>
                

                
                
        user>

        <user name="user">
                <property name="password">userproperty>
                <property name="schemas">TESTDBproperty>
                <property name="readOnly">trueproperty>
        user>

​ 这里配置了两个可以来连接的用户用户1 test 密码test 给予了此用户TESTDB数据库的权限用户2 user 密

码user 给予了此用户TESTDB数据库的只读权限注意这里的testdb 不一定是你数据库上的真实库名.可以任意指

定.只要和接下来的schema.xml的配置文件中的库名统一即可

(二)接下来配置schema.xml

备份源schema.xml文件

[root@localhost ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak.

# 已经存在就不需要备份了
[root@mycat conf]# ls | grep schema.xml
schema.xml
schema.xml.bak
[root@mycat conf]# 

配置

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        schema>
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()heartbeat>
                
                <writeHost host="hostM1" url="192.168.43.139:3306" user="Mycat"
                                   password="Mycat_123">
                <readHost host="hostM2" url="192.168.43.140:3306" user="Mycat" password="Mycat_123" />
                writeHost>
                
        dataHost>
(三)配置文件解释

一,

​ 这里TESTDB 就是我们对外声称的我们有数据库的名称 必须和server.xml中的用户指定的数据库名称一致

添加一个dataNode=“dn1” 是指定了我们这个库只在dn1上.没有进行分库

二,

​ 这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 .根据你自己的数据库名进行修改.

三,

这里只需要配置三个地方 balance="1"与writeType=“0” ,switchType=”1”

a. balance 属性负载均衡类型,目前的取值有 4 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。

3. balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。

4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。


b. writeType 属性
负载均衡类型,目前的取值有 3 种:

1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换[记录](http://javascript:;)在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。1.5后废弃,不推荐


c. switchType 属性
- -1 表示不自动切换
- 1 默认值,自动切换
- 2 基于MySQL 主从同步的状态决定是否切换

slaveThreshold="100"

开始支持 MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:

MyCAT心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2"slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机
制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", 
"Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延, 
当Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之
前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则
表示主从同步,可以安全切换,否则不会切换。

(四)心跳检查语句
<heartbeat>select user()heartbeat>
(五)配置两台读写服务器
<writeHost host="hostM1" url="192.168.43.139:3306" user="Mycat" password="Mycat_123" />

<readHost host="hostS1" url="192.168.43.140:3306" user="Mycat" password="Mycat_123" />
writeHost>

这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码

四、启动mycat
/usr/local/mycat/bin/mycat start
1. 测试
1. 使用test用户
[root@localhost ~]# mysql -u test -ptest -h 192.168.43.138 -P 8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.01 sec)

mysql> use TESTDB

mysql> select * from t1;
Empty set (0.01 sec)

mysql> insert into t1 values(1,'robin');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
+------+-------+
1 row in set (0.00 sec)

使用test用户可读可写,但是查看的时候只能查看mysql-b写入的东西。
mysql-a是写服务器,mysql-b是读服务器。
当使用mycat服务器使用test用户进行写入的时候,在mysql-b上可以读(查看)
user用户只有只读权限
2. 使用user用户
[root@mycat ~]# mysql -u user -puser -h 192.168.43.138 -P 8066
mysql> use TESTDB
Database changed
mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    3 | tom   |
|    4 | jerry |
+------+-------+
2 rows in set (0.00 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    3 | tom   |
|    4 | jerry |
|    6 | bb    |
+------+-------+
3 rows in set (0.00 sec)

mysql> insert into t1 values(2,'zorro');
ERROR 1495 (HY000): User readonly

6 bb 数据是从写服务器mysql-a中填写的
因为配置文件中user用户只读权限,所以其不能进行写操作。

mysql-a

[root@mysql-a ~]# mysql -u root -p123

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+
1 row in set (0.01 sec)

mysql> select * from t1;
Empty set (0.00 sec)

mysql> insert into t1 values(1,'robin');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t1 values(2,'zorro');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
|    5 | aa    |
+------+-------+
3 rows in set (0.00 sec)

此处的数值的(5,'aa')是通过使用test用户在mycat上创建的。
mysql-b是读服务器 在mysql-a创建数据时,在mycat是看不见的

mysql-b

[root@mysql-b ~]# mysql -u root -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

mysql> select * from t1;
Empty set (0.22 sec)

mysql> insert into t1 values(3,'tom');
Query OK, 1 row affected (0.04 sec)

mysql> insert into t1 values(4,'jerry');
Query OK, 1 row affected (0.04 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    3 | tom   |
|    4 | jerry |
+------+-------+
2 rows in set (0.00 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    3 | tom   |
|    4 | jerry |
+------+-------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(6,'bb');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    3 | tom   |
|    4 | jerry |
|    6 | bb    |
+------+-------+
3 rows in set (0.00 sec)

mysql-b是写服务器

也就是说test用户可读可写 user只读但是都在mysql-a这个库上

修改参数使读写可以分离

一共8个数据 在mysql-a上可以查看1 2 5 7 8 msyql-b可以查看3 4 6

[root@localhost ~]# mysql -u test -ptest -h 192.168.0.11 -P 8066
mysql> use TESTDB
mysql> select * from t1;
Empty set (0.03 sec)

mysql> insert into t1 values(2,'zorro');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
Empty set (0.01 sec)


到mysql-a上验证

[root@mysql-a ~]# mysql -u root -p"Robin_123"
mysql> use db

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)

错误

通过mycat start启动失败,wrapper.log有如下报错信息:
STATUS | wrapper  | 2016/06/17 15:26:16 | Launching a JVM...
ERROR  | wrapper  | 2016/06/17 15:26:46 | Startup failed: Timed out waiting for a signal from the JVM.
ERROR  | wrapper  | 2016/06/17 15:26:46 | JVM did not exit on request, terminated
INFO   | wrapper  | 2016/06/17 15:26:46 | JVM exited on its own while waiting to kill the application.
STATUS | wrapper  | 2016/06/17 15:26:46 | JVM exited in response to signal SIGKILL (9).

后来通过startup_nowrap.sh,发现可以启动成功。
可修改conf/wrapper.conf中设置如下参数:

# 设置超时时间为2小时wrapper.startup.timeout=7200

# 设置心跳超时时间为1小时wrapper.ping.timeout=3600
重新通过mycat start启动,启动成功~

2. MyCat垂直切分

垂直切分(分库)

​ 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的

数据库上面,这样也就将数据或者说压力分担到不同的库上面

MySQL-基础部分_第6张图片

环境根据上个实验

在mysql-a 和 mysql-b 上创建相同的库 但是存在着不同的表

master-a

[root@mysql-a ~]# mysql -u root -p"Robin_123"
mysql> create database test;
mysql> use test
mysql> create table emp(id int,name char(10));
mysql> insert into emp values(1,'robin');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(2,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.00 sec)

master-b

[root@mysql-b ~]# mysql -u root -p"Robin_123"

mysql> create database test;
mysql> use test
mysql> create table dpt(did int,dname char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into dpt values(1,'tom');
Query OK, 1 row affected (0.00 sec)

mysql> insert into dpt values(2,'jerry');
Query OK, 1 row affected (0.00 sec)

mysql> select * from dpt;
+------+-------+
| did  | dname |
+------+-------+
|    1 | tom   |
|    2 | jerry |
+------+-------+
2 rows in set (0.00 sec)

修改mycat配置文件

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml

此处可以不做修改
<user name="robin">
                <property name="password">robinproperty>
                <property name="schemas">testproperty>
user>
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">  
 <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
            <table name="emp" primaryKey="id" type="global" dataNode="dn1" />
            <table name="dpt" primaryKey="did" type="global" dataNode="dn2" />
    schema>
    <dataNode name="dn1" dataHost="localhost1" database="test" />
    <dataNode name="dn2" dataHost="localhost2" database="test" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <heartbeat>select user()heartbeat>
            <writeHost host="dn1" url="192.168.0.12:3306" user="robin" password="Mycat_123">
            writeHost>
    dataHost>
    <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
            <heartbeat>select user()heartbeat>
            <writeHost host="dn2" url="192.168.0.13:3306" user="robin" password="Mycat_123">
            writeHost>
    dataHost>
mycat:schema>

 

测试

[root@localhost ~]# mysql -u test -ptest -h 192.168.43.138 -P 8066

mysql> use test;

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dpt            |
| emp            |
+----------------+
2 rows in set (0.01 sec)


mysql> select * from dpt;
+------+-------+
| did  | dname |
+------+-------+
|    1 | tom   |
|    2 | jerry |
+------+-------+
2 rows in set (0.06 sec)

mysql> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
+------+-------+
2 rows in set (0.01 sec)


插入数据进行测试,在mycat上分别向emp dpt表中插入数据
mysql> insert into emp values(3,'aa');
Query OK, 1 row affected (0.01 sec)

mysql> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
|    3 | aa    |
+------+-------+
3 rows in set (0.00 sec)

mysql> insert into dpt values(3,'bb');
Query OK, 1 row affected (0.00 sec)

mysql> select * from dpt;
+------+-------+
| did  | dname |
+------+-------+
|    1 | tom   |
|    2 | jerry |
|    3 | bb    |
+------+-------+
3 rows in set (0.01 sec)


在mysql-a 和 mysql-b上分别查看数据信息

mysql-a
mysql> select * from emp;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
|    2 | zorro |
|    3 | aa    |
+------+-------+
3 rows in set (0.00 sec)


mysql-b
mysql> select * from dpt;
+------+-------+
| did  | dname |
+------+-------+
|    1 | tom   |
|    2 | jerry |
|    3 | bb    |
+------+-------+
3 rows in set (0.00 sec)

3. MyCat水平切分

水平切分(分表)

​ 水平切分相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每

个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些

行切分到一个数据库,而另外的某些行又切分到其他的数据库中

MySQL-基础部分_第7张图片

环境根据上个实验

在mysql-a 和 mysql-b 上创建相同的库 但是存在着相同的表

mysql> create database redhat;
mysql> use redhat
mysql> create table t1(id int primary key auto_increment,name char(10));
mysql> grant all privileges on redhat.* to robin@'192.168.0.11' identified by 'Mycat_123';

修改配置文件

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml 
<user name="robin">
                <property name="password">robinproperty>
                <property name="schemas">testproperty>
user>
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
                <table name="t1" primaryKey="id" dataNode="dn1,dn2" rule="rule1" />
        schema>
        <dataNode name="dn1" dataHost="localhost1" database="redhat" />
        <dataNode name="dn2" dataHost="localhost2" database="redhat" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()heartbeat>
                <writeHost host="dn1" url="192.168.0.12:3306" user="robin" password="Mycat_123">
                writeHost>
        dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()heartbeat>
                <writeHost host="dn2" url="192.168.0.13:3306" user="robin" password="Mycat_123">
                writeHost>
        dataHost>
mycat:schema>
[root@mycat ~]# vim /usr/local/mycat/conf/rule.xml 
<tableRule name="rule1">
                <rule>
                        <columns>idcolumns>
                        <algorithm>func1algorithm>
                rule>
tableRule>




<function name="func1" class="io.mycat.route.function.PartitionByLong">
                <property name="partitionCount">2property>
                <property name="partitionLength">512property>
function>


测试

mycat上
[root@mycat ~]# mysql -u test -ptest -h 192.168.43.138 -P 8066

mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| t1               |
+------------------+
1 row in set (0.01 sec)

mysql> insert into t1 values(1,'robin');
ERROR 1064 (HY000): partition table, insert must provide ColumnList
# 注: 此处不能继续使用这种方式进行添加数据。

mysql> insert into t1(id,name) values(1,'robin');
Query OK, 1 row affected (0.10 sec)

mysql> insert into t1(id,name) values(1023,'zorro');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | robin |
| 1023 | zorro |
+------+-------+
2 rows in set (0.04 sec)

master-a

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | robin |
+----+-------+
1 row in set (0.00 sec)

master-b

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
| 1023 | zorro |
+------+-------+
1 row in set (0.00 sec)

4. 实验

MySQL-基础部分_第8张图片

11. MySQL Cluster

MySQL-基础部分_第9张图片

1 准备5台服务器,为五台机器分别安装Linux操作系统(RHEL 6.5 x86_64bit),并分配IP地址

Management Node 1.1.1.6 (负责管理整个集群)
SQL Node 1.1.1.7 (负责操作数据库)
SQL Node 1.1.1.8 (负责操作数据库)
Data Node 1.1.1.9 (负责存储数据)
Data Node 1.1.1.10 (负责存储数据)

(SQL节点和数据节点可以同在一台机器上)

2、修改5台服务器的/etc/hosts文件,修改完后的内容如下:

1.1.1.6 node1.manager.com
1.1.1.7 node2.sql1.com
1.1.1.8 node3.sql2.com
1.1.1.9 node4.data1.com
1.1.1.10 node5.data2.com

3.分别在5台服务器上解压 mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz

[root@node5 ~]# cd /tmp
[root@node5 tmp]# tar xf mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz
[root@node5 tmp]# mv mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64 /usr/local/mysql-cluster
[root@node5 tmp]# chown -R mysql.mysql /usr/local/mysql-cluster

注意:管理节点只需要建立/usr/local/mysql-cluster/目录
将ndb_mgm ndb_mgmd两个可执行程序拷贝到/usr/local/mysql-cluster/下(从任意节点拷贝)

4.管理节点的配置

vim /usr/local/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[ndb_mgmd]
hostname=1.1.1.6
datadir=/usr/local/mysql-cluster

[ndbd]
hostname=1.1.1.9
datadir=/usr/local/mysql-cluster/data

[ndbd]
hostname=1.1.1.10
datadir=/usr/local/mysql-cluster/data

[mysqld]
hostname=1.1.1.7

[mysqld]
hostname=1.1.1.8

5 启动管理节点

/usr/local/mysql-cluster/bin/ndb_mgmd -f /usr/local/mysql-cluster/config.ini --initial

(第一次启动时这样执行,如果后面新添加了数据节点。执行此命令时,需要带上–initital参数,否则新添加的节点,无法被识别)

[root@node5 mysql-cluster]# ndb_mgm (查看启动后的集群状态,看看集群是否成功启动,如果看到以下内容,表示集群已经成功配置并启动)
– NDB Cluster – Management Client –
ndb_mgm> show
Connected to Management Server at: localhost:1186

1. Cluster Configuration

[ndbd(NDB)]	2 node(s)
id=2	@1.1.1.9  (mysql-5.6.21 ndb-7.3.7, Nodegroup: 0, *)
id=3	@1.1.1.10  (mysql-5.6.21 ndb-7.3.7, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@1.1.1.6  (mysql-5.6.21 ndb-7.3.7)

[mysqld(API)]	2 node(s)
id=4	@1.1.1.7  (mysql-5.6.21 ndb-7.3.7)
id=5	@1.1.1.8  (mysql-5.6.21 ndb-7.3.7)

6 数据节点(注意实验环境内存尽量设置大于1G)

[root@node3 mysql-cluster]# vim /etc/my.cnf
[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=1.1.1.6

启动
/usr/local/mysql-cluster/bin/ndbd

7 SQL节点

vim /etc/my.cnf
[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=1.1.1.6

初始化(只SQL需要做)
cd /usr/local/mysql-cluster/
./scripts/mysql_install_db --user=mysql

启动sql节点
./bin/mysqld_safe --user=mysql &

测试
1.测试数据同步读取

create database king;
create table test(id int) engine=ndbcluster;
insert into test values(1);
select * from test;

2.测试数据节点失败

3.测试SQL节点失败

12. MySQL应用

1. LAMP架构

准备两台虚拟机,一台上做Apache php 另外一台做mysql


一.apache  php

yum install httpd php php-mysql

vim /etc/httpd/conf.modules.d/10-php.conf
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>

[root@mycat ~]# ls /etc/httpd/modules/libphp5.so
/etc/httpd/modules/libphp5.so

启动服务
systemctl restart httpd

测试页

[root@master ~]# cd /var/www/html/
[root@master html]# ls
[root@master html]# vim /var/www/html/index.php
<?php
        phpinfo()
?>

在网页上输入自己的ip地址,能够查看php的版本即为安装成功。

二.安装mysql
略(源码  rpm)

2. MySQL和FTP实现虚拟用户

1 解压进行编译安装。

安装mysql-server mysql-devel vsftpd

tar zxvf pam_mysql-0.7RC1.tar.gz #解压
cd pam_mysql-0.7RC1 #进入解压后的目录。
./configure --with-openssl #进行编译前的配置
make #编译服务器程序 
make install #安装以以编译完成的程序

2、配置mysql

cd /usr/lib/security/ 
cp pam_mysql.so /lib/security/ #拷贝pam和mysql连接的库文件到/lib/security/下。
service mysqld start #启动mysqld服务,注意有个”d“

3、在mysql里面创建数据库、表以及在表里面插入用户名和密码。

mysqladmin -u root -p password test 为管理员更改密码
注意:——>下面在提示输入密码则回车,因为之前没有设置密码。
mysql -u root -p 登录mysql
create database chen; #注意结束的时候在命令后面加分号。
use chen #进入刚刚创建好的数据库里面去。
create table jun
(id int not null primary key auto_increment, #设置ID列自动增长。
name nvarchar(30),
passwd nvarchar(20)); #创建一个表格叫jun的,并在里面插入两列,name和passwd

insert into jun 
values ('','user1','123');
insert into jun 
values ('','user2','123');
insert into jun 
values ('','user3','123'); #插入三个用户。

可以用:show databases; #查看数据库是否创建正确。
:show tables; #查看表格是否创建正确。
:select * from jun; #查看用户插入是否正确。

4、授予virtual只能读chen数据库的jun表。

grant select on chen.jun to virtual@localhost identified by '123';
验证刚刚才的操作是否成功:
mysql -u virtual -p123 chen
select * from jun; #可以看到刚刚插入的用户名。

5、建立虚拟用户所需的pam配置文件。

vi /etc/pam.d/vsftpd.vu
auth required pam_mysql.so user=virtual passwd=123 host=localhost db=chen table=jun usercolumn=name passwdcolumn=passwd crypt=0
account required pam_mysql.so user=virtual passwd=123 host=localhost db=chen table=jun usercolumn=name passwdcolumn=passwd crypt=0

pam_mysql.so #是用于linux连接mysql的库文件。就是我们上面从/usr/lib/security/pam_mysql.so 复制到/lib/security/目录下的那个程序。
user=virtual #用于访问Mysql的用户。
passwd=123 #对应的是用户的密码。 
host=localhost #代表mysql在本机。
db=chen #指定在mysql上的数据库。
table=jun #指定mysql上存放用户的表格。
usercolumn=name #指定用户名的列。
passwdcolumn=passwd #指定密码的列。
crypt=0 
\#crypt=0: 明文密码
\#crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)
\#crypt=2: 使用MYSQL中的password()函数加密
\#crypt=3:表示使用md5的散列方式

注意:这里特别要注意的是上面是两条语句,一行没写完不能回车!这里要是多了个回车用户都不能正常登录。

6、配置/etc/vsftpd/vsftpd.conf文件在里面添加

guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd_user_conf

7、配置用户单独的配置文件

mkdir /etc/vsftpd_user_conf 创建用户单独配置文件的目录。
mkdir user1 创建与用户同名的文件在文件里面写入:local_root=/ftp/user1 指定用户的登录目录。
mkdir user2 user2和user3同上
mkdir user3

8、创建用户登录目录。

mkdir -p /ftp/user1
mkdir -p /ftp/user2
mkdir -p /ftp/user3
chown -R virtual.virtual /ftp

9、创建用户virtual

useradd virtual 
chown virtual.virtual /home/virtual
chmod 700 /home/virtual

你可能感兴趣的:(MySQL基础阶段,mysql,数据库,sql)