2022/7/25
暑假学习ing
【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】
尚硅谷MySQL学习笔记
虚拟机VMWare+Linux系统CentOS7安装【Linux】
Centos 7
mysql-1 安装mysql5.7
mysql-2 安装mysql8.0
[root@centos7-mysql-2 ~]# vim /etc/hostname
[root@centos7-mysql-2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@centos7-mysql-2 ~]# systemctl restart network
动态ip
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3bd21fb4-a2f2-40f2-bb41-d00fff5b2283
DEVICE=ens33
ONBOOT=yes
~
UUID改一下
注意:ONBOOT=yes
具体配置静态ip
在VMware中给Linux虚拟机配置静态IP的详细步骤(CentOs 7)
配置静态ip
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp 改成静态
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3bd21fb4-a2f2-40f2-bb12-d00fff5b2283
DEVICE=ens33
ONBOOT=yes
#IP地址
IPADDR=192.168.253.140 #自己设置
NETMASK=255.255.255.0 #固定
#网关
GATEWAY=192.168.253.2 # .2 不变
#域名解析器
DNS1=192.168.253.2 # 与网关一样
注意重启网络服务:systemctl restart network
测试 ip addr
[root@centos7-mysql-2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:50:56:25:79:f6 brd ff:ff:ff:ff:ff:ff
inet 192.168.253.131/24 brd 192.168.253.255 scope global noprefixroute dynamic ens33
valid_lft 1790sec preferred_lft 1790sec
inet6 fe80::2e52:b232:7baa:c97d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:63:fe:86 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:63:fe:86 brd ff:ff:ff:ff:ff:ff
[root@centos7-mysql-2 ~]#
Xshell
和Xftp
等访问CentOS系统的工具
1.防火墙:6是iptables, 7是firewalld
2.启动服务的命令:6是service,7是systemctl
mysql1
的/opt
放入
centos7下安装mysql5.7(rpm)
官网:https://downloads.mysql.com/archives/community/
也可以分别下载
下载以下文件
mysql2
的/opt
放入
mysql2的/opt
放入
略
略
- MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
- MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完 备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
- MySQL Cluster 集群版,开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
- MySQL Cluster CGE高级集群版,需付费。
8.0.27
。此前,8.0.0在2016.9.12日就发布了。8.0.25版本
。同时为了更好的说明MySQL8.0新特性,还会安装MySQL5.7版本,作为对比。此外,官方还提供了 MySQL Workbench
(GUITOOL)一款专为MySQL设计的ER/数据库建模工具
。它是著名的数据库设计工具DBDesigner4的继任者。MySQLWorkbench又分为两个版本,分别是社区版
(MySQL Workbench OSS)、商用版
(MySQLWorkbenchSE) o
1.下载地址
https://downloads.mysql.com/archives/community/
5.Linux系统下安装MySQL的几种方式
5.1Linux系统下安装软件的常用三种方式:
方式1:rpm命令
使用rpm命令安装扩展名为".rpm"的软件包。
方式2:yum命令
需联网,从互联网获取的yum源,直接使用yum命令安装。
方式3:编译安装源码包
针对tar.gz这样的压缩格式,要用tar命令来解压;如果是其它压缩格式,就使用其它命令。
5.2Linux系统下安装MySQL,官方给出多种安装方式
略
由于mysql安装过程中,会通过mysql用户在/tmp_db文件,所以请给/tmp较大的权限。执行:chmod -R 777 /tmp
rpm -qa|grep libaio
rpm -qa|grep net-tools
略
在mysql的安装文件目录下执行:(必须按照顺序执行)
rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugirps-8.o.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
rpm
是Redhat Package Manage缩写,通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。-i
,–install安装软件包-v
,–verbose 提供更多的详细信息输出-h
,–hash 软件包安装的时候列出哈希标记(和-v一起使用效果更好),展示进度条一个命令:
yum remove mysql-libs
解决,清除之前安装过得依赖即可
mysql2 5.7.28的顺序
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
执行如下命令,如果成功表示mysql安装成功。类似java -version如果打印出版本等信息
mysql --version
# 或
mysqladmin --version
执行如下命令,查看是否安装成功。需要增加-i不用区分大小写,否则搜索不到。
rpm -qa|grep -i mysql
为了保证数据库目录与文件的所有者为mysql登录用户,如果你是以root身份运行mysql服务,需要执行下面的命令初始化:
mysqld --initialize --user=mysql
说明:–initialize 选项默认以“安全”模式来初始化,则会为root用户生成一个密码并将该密码标记为过期
,登录后你需要设置一个新的密码。生成的临时密码
会往日志中记录一份。
111
查看密码:
cat /var/log/mysqld.log
j:hz2hS7Y0XY
+Zj1y#:UH:xE
```bash
systemctl start mysqld
systemctl list-unit-files|grep mysqld.service
默认是enabled
systemctl enable mysqld.service
systemctl disable mysqld.service
尝试登录
具体查看3.1
修改密码
具体查看3.2
7/25 20:35
尝试登录
[root@centos7-mysql-2 opt]# mysql -uroot -pj:hz2hS7Y0XY
[root@centos7-mysql-2 opt]# mysql -uroot -p+Zj1y#:UH:xE
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'
2.在远程机器上使用telnet 命令保证端口号开放
访问
telnet ip地址 端口号
拓展:telnet命令开启
关闭Windows防火墙
还需关闭虚拟机的防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl status firewalld
systemctl disable firewalld
mysql下
show databases;
use mysql;
select host,user from user;
所以需要设置可以远程连接
update user set host = '%' where user = 'root';
实际开发中,可以写得严谨一点
update user set host = '192.168.1.%' where user = 'root';
flush privileges;
测试连接,发现报错不一样了。这个问题只会在mysql8.0中出现。
因为mysql8.0新特性:对密码进行加密。
解决方法:Linux下,登录mysql之后,执行这条SQL:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
然后再重新配置SQLyog连接,则可连接成功了,OK。
跳转5
mysql1 mysql8.0的连接成功
连接mysql2 mysql5.7
提示:
关闭防火墙
修改root用户远程登录
一定要执行操作,刷新权限,才可以起作用
flush privileges;
略
在MySQL8.0版本之前,默认字符集为latin1
,utf8字符集指向的是utf8mb3
。网站开发人员在数据库设计的时 候往往会将编码修改为utf8字符集。如果遗忘修改默认的编码,就会出现乱码的问题。从MySQL8.0开始,数据库的默认编码将改为utf8mb4
,从而避免上述乱码的问题。
操作1:查看默认使用的字符集
show variables like 'character%';
#或者
show variables like '%char%';
MySQL8.0中执行:
show create table emp1;
show create database dbtest1;
2.修改
vim /etc/my.cnf
修改文件
最后添加语句
character_set_server=utf8
3.最后重启mysql服务
systemctl restart mysqld.service
4.重新登录并查看
show variables like '%character%';
注意:
已有的数据库的字符集不会修改,
已有数据库下新建表(没有指明字符集)和数据库的字符集保持一致
修改已有数据库的字符集
alter database dbtest1 character set 'utf8';
修改已有数据表的字符集
alter table t_emp convert to character set 'utf8';
注意:可能会有已有数据的乱码问题
MySQL有4个级别的字符集和比较规则,分别是:
执行如下SQL语句:
show variables like 'character%';
创建数据库,如无指明字符集,则默认和服务器级别一样
同理:当前一级的默认创建,其字符集和上一级相同
可以显示指明创建的字符集
character set 'utf8'
实际开发中不太需要,统一utf8字符集
略
通过如下指令可以查看mysql支持的字符集:
SHOW CHARSET;
# 或者
SHOW CHARACTER SET;
略
常用操作1
# 查看GBK字符集的比较规则
SHOW COLLATION LIKE 'gbk%'
# 查看UTF-8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'
#查看服务器的字符集和比较规则
SHOW VARIABLES LIKE '%_server';
#查看数据库的字符集和比较规则
SHOW VARIABLES LIKE '%_database';
#查看具体数据库的字符集和比较规则
SHOW CREATE DATABASE dbtest1;
#修改具体数据库的字符集和比较规则
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
常用操作3
#查看表的字符集
SHOW CREATE TABLE emp1;
#查看表的比较规则
SHOW TABLE STATUS FROM dbtest1 LIKE 'emp1';
#修改表的字符集和比较规则
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
经验
都设置成utf8
SET NAMES utf8
在SQL中,关键字和函数名是不区分大小写的。
大小写规范:
Windows系统默认大小写不敏感
Linux系统默认大小写敏感
通过命令查看:
SHOW VARIABLES LIKE '%lower_case_table_name%';
lower_case_table_names参数值的设置:
两个平台上SQL大小写的区别具体来说:
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名、表名、表的别名、变量名是严格区分大小写的;
2、关键字、函数名称在SQL中不区分大小写;
3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;
MySQL在Windows的环境下全部不区分大小写
当想设置为大小写不敏感时,要在my.cnf这个配置文件[mysqld]中加入lower_case_table_names=1
,然后重启服务器。
1、停止MySQL服务
2、删除数据目录,即删除/var/lib/mysql目录
3、在MySQL配置文件(/etc/my.cnf)中添加lower_case_table_names=1
4、启动MySQL服务
注意:在进行数据库参数的设置之前,需要掌握这个参数带来的影响,切不可盲目设置
如果你的变量名命名规范没有统一,就可能产生错误。这里有一个有关命名规范的建议:
- 关键字和函数名称全部大写;
- 数据库名、表名、表别名、字段名、字段别名等全部小写;
- SQL语句必须以分号结尾。
数据库名、表名和字段名在LinuxMySQL环境下是区分大小写的,因此建议你统一这些字段的命名规则,比如全部采用小写的方式。
虽然关键字和函数名称在SQL中不区分大小写,也就是如果小写的话同样可以执行。但是同时将关键词和函数名称全部大写,以便于区分数据库名、表名、字段名。
sql_mode会影响MySQL支持的SQL语法以及它执行的数据验证检查
。通过设置sql_mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。
MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。
MySQL5.6和MySQL5.7默认的sql_mode模式参数是不一样的:
NO_ENGINE_SUBSTITUTION
),其实表示的是一个空值,相当于没有什么模式设置,可以理解为宽松模式
。在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。STRICTITRANS_TABLES
,也就是严格模式
。用于进行数据的严格校验,错误数据不能插入,报 error(错误),并且事务回滚。宽松模式:
如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受,并且不报错。
举例
:我在创建一个表时,该表中有一个字段为name,给name设置的字段类型时char(10)
,如果我在插入数 据的时候,其中name这个字段对应的有一条数据的长度超过了10
,例如’1234567890abc,超过了设定的字段长度10,那么不会报错,并且取前10个字符存上,也就是说你这个数据被存为了’1234567890,而’abc’就没有了。但是,我们给的这条数据是错误的,因为超过了字段长度,但是并没有报错,并且mysqI自行处理并接受了,这就 是宽松模式的效果。
应用场景
:通过设置sql mode为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移
时,则不需要对业务sql进行较大的修改。
严格模式:
出现上面宽松模式的错误,应该报错才对,所以MySQL5.7版本就将sql_mode默认值改为了严格模式。所以在生产等环境
中,我们必须采用的是严格模式,进而开发、测试环境
的数据库也必须要设置,这样在开发测试阶段就可 以发现问题。并且我们即便是用的MySQL5.6,也应该自行将其改为严格模式。
开发经验
:MySQL等数据库总想把关于数据的所有操作都自己包揽下来,包括数据的校验,其实开发中,我们应该在自己开发的项目程序级别将这些校验给做了
,虽然写项目的时候麻烦了一些步骤,但是这样做之后,我们在进 行数据库迁移或者在项目的迁移时,就会方便很多。
改为严格模式后可能会存在的问题:
若设置模式中包含了NO_ZERO_DATE
,那么MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警 告。例如,表中含字段TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT 0000-00-00 00:00:00’(零时间戳),这显然是不满足sql_mode中的NO_ZERO_DATE而报错。
select @@session.sql_mode ;
select @@global.sql_mode ;
#或者
show variable like 'sql_mode';
select @@global.sql_mode ; #全局
# 重启mysql服务就不生效了
select @@session.sql_mode ; #当前会话
# 关闭当前会话就不生效了
在my.cnf文件(Windows系统是my.ini文件),新增:
[mysqld]
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'
然后重启mysql
当然生产环境上是禁止重启mysql服务的,所以采用临时设置方式+永久设置方式
来解决线上的问题,那么即便有一天真的重启了mysql服务,也会永久生效了。
CREATE TABLE mytbl2(id INT,NAME VARCHAR(16),age INT,dept INT);
INSERT INTO mytbl2 VALUES(1, 'zhang3',33,101);
INSERT INTO mytbl2 VALUES(2,'li4',34,101);
INSERT INTO mytbl2 VALUES(3,'wang5',34,102);
INSERT INTO mytbl2 VALUES(4,'zhao6',34,102);
INSERT INTO mytbl2 VALUES(5,'tian7',36,102);
#查询每个部门年龄最大的人
SELECT NAME, dept,MAX(age) FROM mytbl2 GROUP BY dept;
# 设置sql_mode
SET SESSION sql_mode='';
INSERT INTO mytbl2 (id,NAME,age)
VALUES(6,'Tom','aaa');
SELECT * FROM mytbl2;
略
p97~p103
2022/7/28 12:27
Markdown 18369 字数 871 行数
HTML 11368 字数 423 段落