个人博客
https://blog.youkuaiyun.com/cPen_web
MySQL的配置文件
mysql的配置文件:/etc/my.cnf
配置文件的作用:给进程传递参数
[root@cPen_aliyun mysql]# vim /etc/my.cnf
[mysqld_safe] #注:指定mysqld_safe进程的配置 (传参)
#需要创建mkdir /data/mysql 目录,然后使用命令chmod mysql:mysql /data/mysql
#因为mysql进程需要往/data/mysql目录里写东西,需要授权,不然不能往目录下写日志
[client] #注:所有的客户端连接过来加载的配置 (传参)
socket=/data/mysql/mysql.sock #注:指定socket文件路径,方便客户端连接找到
[mysqld] #注:mysqld是服务器端的配置 (传参)
log-error=/data/mysql/mysql.log #注:指定mysql的日志文件的路径
socket=/data/mysql/mysql.sock #注:socket文件路径(进程和进程之间通信的文件)
port = 3306 #注:port指定端口号
open_files_limit = 8192 #注:指定mysql进程可以打开的文件数量,需要在操作系统里允许进程打开更多的文件
innodb_buffer_pool_size = 512M #注:指定缓存池的大小,提升数据性能的参数,最大可以达到物理内存的80%
#user=mysql
#skip-grant-tables #注:破解密码用
[mysql] #注:对mysql命令执行的配置
auto-rehash #注:auto-rehash 支持tab键补齐
prompt=\u@\d \R:\m mysql> #注:提示符
#注:修改配置文件后,需要刷新mysql的服务 service mysqld restart
prompt=\u@\d \R:\m mysql>
\u 代表登录的用户 user
@ 是分隔符
\d 当前所在的数据库的名字
\R:\m 当前linux系统里的时间
mysql> 固定的内容
socket文件:是mysqld和mysql这个进程之间通信的文件
show variables; 在mysql查看mysqld这个软件里有哪些变量(参数)
#示例:查看mysql里所有的变量
root@(none) 16:29 mysql>show variables;
[root@mysql_compile test]# mysql -uroot -p'Sanchuang123#' -e "show variables" #注:非交互式
#示例:统计有多少变量
[root@mysql_compile test]# mysql -uroot -p'Sanchuang123#' -e "show variables"|wc -l
517 #注:500多个变量
示例:让rpm安装的mysql也有提示符
[root@cPen ~]# vim /etc/my.cnf
[mysql]
auto-rehash #注:auto-rehash 支持tab键补齐
prompt=\u@\d \R:\m mysql> #注:提示符
#注:mysql是客户端的命令,不需要重启服务区刷新配置文件
[root@cPen ~]# mysql -uroot -p'Sanchuang123#'
root@(none) 21:24 mysql>
[root@cPen ~]# vim /etc/my.cnf
[client]
socket=/data/mysql/mysql.sock
#注:对客户端的配置
#注:socket是用来指定socket文件的路径,方便客户端连接找到
socket 套接字、槽 --> 连接2个东西的接头
Linux里一切皆文件
mysql里的库,本质上其实是一个文件夹
库里的表,其实就是文件 --> 才是真正存放数据的地方
root@(none) 16:54 mysql>use mysql; #注:使用mysql --> 切换到mysql库
root@mysql 16:54 mysql>create database sanchuang; #注:建库
root@mysql 16:59 mysql>use sanchuang
root@sanchuang 16:59 mysql>create table student(id int); #注:建表
[root@mysql_compile ~]# cd /data/mysql/ #注:数据目录里
[root@mysql_compile mysql]# ls |grep sanchuang #注:有sanchuang文件夹
sanchuang
[root@mysql_compile mysql]# cd sanchuang/
[root@mysql_compile sanchuang]# ls |grep student #注:有student文件
student.frm
student.ibd
DBMS
DBMS:database manager system 数据库管理系统
管理数据的软件 database manager system
mysql就是一个DBMS
数据可以存放在哪里?
1 .文件 --> 普通的文本文件、excel表格
2 .数据库
在mysql里一个库其实是一个文件夹
库里的表,其实就是一个文件 --> 才是真正存放数据的地方
为什么需要使用专业的数据库软件来管理数据?
好处:
1 .数据量可以无限大
2 .查找非常方便
3 .多种程序都可以去同一个地方访问数据 --> 数据的统一管理和保存,不区分程序了
数据的核心功能:存储数据
数据库给谁用的?
1 .开发人员 --> 需要存储数据
2 .给需要存储数据的人用的
root用户不能远程连;要想远程连需要授权一个用户
root@(none) 20:06 mysql>grant all on *.* to 'cPen'@'%' identified by 'Sanchuang123#'; #注:授权
如何知道mysql数据目录在哪?
看进程;看配置文件
[root@mysql_compile ~]# ps aux|grep mysql
--datadir=/data/mysql
[root@mysql_compile ~]# vim /etc/my.cnf
mysql里一个库其实是一个文件夹
库里的表,其实就是一个文件 --> 才是真正存放数据的地方
CREATE DATABASE nongda;
CREATE TABLE student(id INT,NAME VARCHAR(20));
[root@mysql_compile sanchuang]# cd /data/mysql/ #注:数据目录下
[root@mysql_compile mysql]# cd nongda/
[root@mysql_compile nongda]# ls
db.opt student.frm student.ibd
#注:vim编辑会乱码
firewalld和selinux关闭
service方式去停止服务,是centos6或者centos5里常用的方法
centos7和centos8新式用法:systemctl
systemctl --> system control 系统的服务的控制
disable 禁用
enable 开启 --> 使什么能够使用
===============================================================================
#示例:立马停止firewalld服务 --> 立马关闭防火墙服务 --> 影响本次
[root@mysql_compile ~]# service firewalld stop
[root@mysql_compile ~]# systemctl stop firewalld
---------------------------------------------------------------------------------------------------------------------------------
#示例:设置firewalld开机不要启动 --> 下次开机启动的时候,不启动这个服务 --> 影响下次,不影响本次
[root@mysql_compile ~]# systemctl disable firewalld
===============================================================================
[root@mysql_compile ~]# service firewalld stop #注:临时关闭firewalld服务
Redirecting to /bin/systemctl stop firewalld.service #注:Redirect重定向
[root@mysql_compile ~]# systemctl disable firewalld #注:设置firewalld开机不要启动
selinux
selinux 是linux下的安全措施机制,用来保护linux系统的安全。相当于另外一个安全工具
secure linux 安全的linux
/etc/selinux/config selinux的配置文件
[root@mysql_compile ~]# getenforce #注:查看selinux安全策略是否开启
Permissive
[root@mysql_compile ~]# setenforce 0 #注:设置selinux的安全策略不要强制执行,只是给予提醒
Enforcing (默认)表示selinux是强制开启的,linux里的进程在访问文件的时候,会收到selinux策略的影响
Permissive 表示selinux是不强制开启,只是记录下与selinux相关的行为,但是不会制止
Disabled 表示selinux是关闭的
[root@mysql_compile ~]# vim /etc/selinux/config #注:selinux的配置文件
# enforcing - SELinux security policy is enforced. #注:默认
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
在实际的工作中selinux安全机制都是关闭,很少开启
关闭selinux的方法
1 .临时关闭
[root@mysql_compile ~]# setenforce 0
2 .永久关闭
[root@mysql_compile ~]# vim /etc/selinux/config
SELINUX=disabled
mysqld服务 --> mysqld和mysqld_safe进程 --> 3306端口
[root@mysql_compile ~]# service mysqld stop #注:关掉服务
#注:服务关掉后,就没有mysqld的进程了,也不会开放端口 (无进程 无端口)
[root@mysql_compile ~]# mysql -uroot -p'Sanchuang123#' #注:登录
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysql.sock' (2)
进程和进程之间通信的方式
1 .管道 pipe
[root@mysql_compile ~]# cat /etc/passwd|grep cPen
2 .socket --> 套接字
文件socket:是实现一台电脑里的不同进程之间通信的文件 --> 具体的某个文件
/data/mysql/mysql.sock
[root@mysql_compile ~]# ll /data/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 2月 11 21:48 /data/mysql/mysql.sock #注:s socket文件
网络socket:ip + port
网络中通过ip地址找到对方
是实现不同的电脑之间的不同的进程之间的通信的
3 .共享内存
4 .信号
[root@mysql_compile ~]# kill -9 1234
5 .队列
6 .信号量 --> 锁
MySQL的连接方式
MySQL的连接方式:文件socket 网络socket
socket文件一定要防止启动mysqld进程的用户具有写权限的目录里,推荐:数据目录或者/tmp
名字可以自己定义
mysql这个命令在执行的时候,会去读取/etc/my.cnf里的client部分的配置,这样就知道了socket文件的路径,然后直接去访问
配置文件/etc/my.cnf
[root@mysql_compile ~]# mysql -uroot -p'Sanchuang123#' #注:默认采用文件socket的方式去连接
客户端mysql进程会加载[client]里的配置,而服务端mysqld进程会读取[mysqld]里的配置;所以里面的socket文件需要一样
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
socket=/data/mysql/mysql.sock #注:该配置会影响上面的本地连接
[client]和[mysqld]里的socket的路径需要一样
socket文件的名字,可以自己定义
如果在/etc/my.cnf里没有client的配置,默认情况下mysql这个命令会到/tmp/mysql.sock去找socket文件
#示例:-S 是指定socket文件的路径
[root@mysql_compile ~]# mysql -S /data/mysql/mysql.sock -uroot -p'Sanchuang123#'
root@(none) 00:29 mysql>
#示例:查看谁连接到了mysql里 --> 类似于linux的w
show processlist;
root@(none) 00:38 mysql>show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 7 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)
-h 指定主机 (名字或者ip) host
-P 指定端口号 port
-p 指定密码
-u 指定用户 user
-S 指定socket文件的路径 socket
#示例:mysql这个命令使用-h也可以访问远程的mysql服务器 (使用网络socket连接)
[root@mysql_compile ~]# mysql -h 192.168.1.5 -ucPen -p'Sanchuang123#'
[root@mysql_compile ~]# mysql -h 192.168.1.5 -ucPen -p'Sanchuang123#' -P 3309
#示例:可以连接到本地,也使用网络socket
[root@mysql_compile ~]# mysql -h 127.0.0.1 -ucPen -p'Sanchuang123#'
访问mysqld的两条路,是否是同时开启的?
答:是的,都开启
关键点是mysql这个客户端命令你想使用那种方式登录?
文件socket和网络socket
从windows里不能连接到linux里的mysql,如何解决?如果判断故障?
1 .windows的ip设置问题 --> windows的网络问题
ping linux服务器的ip地址 检查网络是否通畅
linux服务器的网络问题
2 .linux里的防火墙是否开启
iptables -L
service firewalld stop
3 .检查下mysql服务是否开启
ps aux|grep mysqld
4 .检查下端口号是否修改
netstat -anplut|grep mysqld
5 .连接的用户是否有授权
grant
6 .云服务器的安全组 --> 使用的是云服务器
mysql服务启动不了,如何解决?
1 .看mysql的配置文件,是否错误的配置
2 .日志 --> 有用的信息 --> 找ERROR提醒
3 .百度、google、问同事朋友
service mysql restart
[root@mysql_compile ~]# service mysql restart
restart 重启 --> 先关闭服务,然后再启动服务
[root@mysql_compile ~]# service mysql stop
[root@mysql_compile ~]# service mysql start
mysql在编译安装的时候指定过
1 .安装目录
2 .数据目录 /data/mysql --> mysql这个启动用户必须要有写的权限
SQL语句
建库 --> 建表 --> 插入数据 --> 查询
#注:查看库
root@(none) 01:01 mysql>show databases;
#注:创建库
root@(none) 01:01 mysql>create database chenpeng;
#注:切换库
root@(none) 01:02 mysql>use chenpeng
#注:查看库里有哪些表
root@chenpeng 01:03 mysql>show tables;
#注:创建表student,里面有2个字段,一个是id列,一个是name列 int 整型 和varchar 可变长的字符类型是数据类型
root@chenpeng 01:04 mysql>create table student(id int,name varchar(20));
#注:插入数据
root@chenpeng 01:05 mysql>insert into student(id,name) values(1,'cPen');
root@chenpeng 01:07 mysql>insert into student(id,name) values(2,'chen');
#注:查询student表里所有的行所有的字段(列)的信息
root@chenpeng 01:07 mysql>select * from student;
+------+------+
| id | name |
+------+------+
| 1 | cPen |
| 2 | chen |
+------+------+
2 rows in set (0.00 sec)
select 查询
* 所有的字段 --> id,name
from 来自哪个表
student 表名
mysql启动不了,如何去解决?
1 .检查配置文件,是否有错误
配置文件里的配置必须要按照mysql里规定的来吗?难道就不可以随便输入吗?
2 .看日志
如何判断mysql服务是否启动?
1 .看进程
2 .看端口号
如何知道安装的MySQL的版本?多少种?(4种)
[root@mysql_compile ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
[root@mysql_compile ~]# mysql -uroot -p'Sanchuang123#' #注:登录mysql时
Server version: 5.7.32 Source distribution
root@(none) 11:44 mysql>select version(); #注:执行version函数
root@(none) 11:45 mysql>show variables like "version"; #注:查询mysql里的version变量的值
root@(none) 11:46 mysql>show variables like "%version%"; #注:% 任意字符
其他电脑的用户连接到本机的mysql里,不能连接过来?
1 .网络是否畅通
2 .检查服务器上mysqld进程是否启动,是否启动相应的端口,默认是3306
3 .检查防火墙是否开启
4 .是否给连接的用户授权
#示例:mysql里执行shell命令
root@(none) 12:16 mysql>system ip add #注:在mysql内部执行linux的命令
看连接的错误提醒,判断mysql的问题
[root@mysql_compile ~]# mysql -uroot -p'123#'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因:Access denied 用户名和密码错误
[root@mysql_compile ~]# mysql -uroot -p'Sanchuang123#'
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/califeng.sock' (2)
原因:
1 .mysqld没有启动
2 .socket文件是否有问题,路径错了
MySQL里密码破解
不同用户
超级用户root@localhost 只能在本地登录 修改/etc/my.cnf
其他的普通用户 使用超级用户登录,直接去修改密码
alter user 'cali'@'%' identified by 'Sanchuang123#';
MySQL里破解密码
===============================================================================
第1步:停止MySQL进程的运行
===============================================================================
第2步:修改配置文件
[root@mysql_compile ~]# vim /etc/my.cnf
[mysqld]
#user=mysql #注:指定启动MySQL进程的用户
skip-grant-tables #注:跳过密码验证
#validate-password=off #注:需要禁用密码复杂性策略
===============================================================================
第3步:启动MySQL进程
===============================================================================
第4步:登录MySQL,不接密码
[root@mysql_compile ~]# mysql -uroot -p
root@(none) 12:33 mysql>
===============================================================================
第5步:修改密码
root@(none) 12:36 mysql>alter user 'root@localhost' identified by 'Sanchuang123#';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
#注:statement 语句
root@(none) 12:36 mysql>flush privileges; #注:刷新权限
#注:刷新权限(会加载原来没有加载的权限表 -->用户名和密码所在的表user等)
root@(none) 12:52 mysql>alter user 'root'@'localhost' identified by 'Sanchuang123#';
root@(none) 12:54 mysql>set password for 'root'@'localhost' = 'Sanchuang123#';
===============================================================================
第6步:重新修改mysql的配置文件
[root@mysql_compile ~]# vim /etc/my.cnf
[mysqld]
socket=/data/mysql/mysql.sock
#skip-grant-tables #注:注释掉
===============================================================================
第7步:刷新服务
[root@mysql_compile ~]# service mysqld restart
===============================================================================
第8步:验证修改密码是否成功
[root@mysql_compile ~]# mysql -uroot -p'Sanchuang123#'
root@(none) 12:59 mysql>
===============================================================================
另外一种方式:
就是使用其他的管理员账号给别的用户重新设置密码
可以在SQLyog里操作
SET PASSWORD FOR 'root'@'localhost' = 'Sanchuang123#';
库在整个linux里是什么?
是一个一个的文件夹,放在数据目录下
表在整个linux系统里是什么?
是一个一个的文件
[root@mysql_compile ~]# cd /data/mysql/
[root@mysql_compile mysql]# cd chenpeng/
[root@mysql_compile chenpeng]# ls
db.opt student.frm student.ibd
[root@mysql_compile chenpeng]# cat db.opt
default-character-set=utf8
default-collation=utf8_general_ci
db.opt存放的是库所使用的字符集和字符集对应的排序规则 --> database option 数据库的选项
student.frm是表结构文件,里面是记录这个表里有哪些字段,以及字段的类型 --> frame 架构、结构
表结构其实就是这个表里有几列,每列的数据类型
行 row --> 一条记录 record
列 column 字段 field 一列就是一个字段
数据类型:整型、字符串、小数
student.ibd是真正存放表里的数据和索引的文件 --> 因为是使用innodb存储引擎存放和读取数据的,innodb data
一行一行的数据存放在这个文件里的
MySQL的存储引擎
存储引擎:是MySQL里的一个专门负责数据的读取和保存的软件 storage engine
1 .myisam --> 读写速度快,容易丢失数据
user.frm 是表结构文件
user.MYD 是存储数据 data
user.MYI 是存放索引 index
索引:是用来查询数据的数据 --> 描述其他数据的数据 --> 加速查询
select的时候,查找出东西快些,不然后就要全表扫描 全表扫描:就是一行一行的将表里的数据都看一遍
2 .innodb --> 默认的存储引擎 --> 速度稍微慢,不丢失数据,非常稳定
存储引擎是捆绑到库上还是表上的?
答:捆绑到表
root@chenpeng 13:35 mysql>show create table student\G;
*************************** 1. row ***************************
Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
#示例:指定存储引擎
root@chenpeng 13:35 mysql>create table stu(id int,name varchar(20)) engine=myisam;
root@chenpeng 13:43 mysql>show create table stu\G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
SQL语句
SQL即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
数据库软件
MySQL、oracle、SQL server等这些数据库软件里的SQL语句都是一模一样的呢?
答:不是都一样,有点个别的差异
SQL语句也有国际化的标准
SQL语句分类
DDL 数据定义语言
Data Definition Language
create drop
DCL 数据控制语言
Data Control Language
grant revoke
DML 数据操作语言
Data Manipulation Language
增删改查 insert delete update select
DQL 数据查询语言 --> 归到DML
Data Query Language
select
---------------------------------------------------------------------------------------------------------------------------------
示例:查看表结构
root@sc mysql>desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
---------------------------------------------------------------------------------------------------------------------------------
示例:删表
root@sc mysql>drop table t1;
---------------------------------------------------------------------------------------------------------------------------------
示例:删库
root@sc mysql>drop database sc;
---------------------------------------------------------------------------------------------------------------------------------
示例:查询命令的使用
root@(none) mysql>help desc;
---------------------------------------------------------------------------------------------------------------------------------
root@chenpeng mysql>create table student(id int,name varchar(20),grade int); #注:建表
示例:往表里插入数据
root@chenpeng mysql>insert into student(id,name,grade) values(1,'cali',80);
root@chenpeng mysql>insert into student(id,name,grade) values(1,'rose',90);
root@chenpeng mysql>insert into student(grade,id,name) values(96,3,'tom');
#注:插入student表id、name、grade字段 值
insert into 插入到
student 是表
(grade,id,name) 小圆括号里的是表里的字段,字段的顺序可以随意,但是必须在表里是存在的
values 值
(96,3,'tom') 一条记录,记录里的值要和表里的字段一一对应
---------------------------------------------------------------------------------------------------------------------------------
#示例:select查询语句
root@chenpeng mysql>select id,grade from student;
root@chenpeng mysql>select * from student;
+------+------+-------+
| id | name | grade |
+------+------+-------+
| 1 | cali | 80 |
| 1 | rose | 90 |
| 3 | tom | 96 |
+------+------+-------+
3 rows in set (0.00 sec)
select 选择
* 表示所有的字段
from 来自哪里 --> 固定语法
student 表示表的名字
---------------------------------------------------------------------------------------------------------------------------------
#示例:delete删除语句
root@chenpeng mysql>delete from student where name='cali';
root@chenpeng mysql>delete from student where grade='90';
root@chenpeng mysql>delete from student where id=3;
where id=3; 指定条件 id等于3的记录
---------------------------------------------------------------------------------------------------------------------------------
#示例:update修改语句
root@chenpeng mysql>update student set grade=100 where id=3;
---------------------------------------------------------------------------------------------------------------------------------
接下来我们可以对表进行DML操作
答:增删改查操作
如何知道当前在那个库里?
1 .看提示符
root@chenpeng mysql>
2 .select database();
root@chenpeng mysql>select database();
+------------+
| database() |
+------------+
| chenpeng |
+------------+
1 row in set (0.00 sec)