首先要准备好安装环境:
① 准备一台有IP地址的虚拟机
② 使用winscp把数据库安装包传到虚拟机中
安装包可自行去官网下载 mysql官网
③ 进行mysql的安装
mysql适用c语言写的,需要c语言环境,需要使用yum命令,此时虚拟机需要能够连接上外网
执行指令
yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio libaio-devel net-tools
因为有些linux系统自带mariadb数据库会与mysql数据库起冲突,所以我们需要查看系统中是否有mariadb数据库,若存在,则需要删除它,执行第三步;若不存在,则直接跳到第四步即可。
rpm -qa 查看系统中已经安装的软件列表
ps -ef 查看系统中正在运行的进程列表
rpm -qa | grep mariadb
yum -y remove mariadb-libs
tar -xf mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar
.tar 压缩包
.rpm 都是tar包解压出来十个的安装包
此时可以用find命令查看一下当前系统中存在mysql的目录,只有两个
mysql解压后还需要进行安装
使用yum指令安装的软件都是rpm格式
rpm安装包是由RedHat红帽公司发明的一个软件包格式,用rpm -ivh 软件包名 进行软件包的安装,依次执行以下命令
rpm -ivh mysql-community-common-5.7.31-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.31-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.31-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.31-1.el7.x86_64.rpm
注: 在安装最后一个server包时,如果报错依赖检测失败
执行这条指令忽略依赖(加上 --nodeps --force)即可
rpm -ivh mysql-community-server-5.7.31-1.el7.x86_64.rpm --nodeps --force
注:Delta RPMs disabled because /usr/bin/applydeltarpm not installed
deltarpm没有安装,接下来我们安装即可,执行以下指令
yum provides '*/applydeltarpm' #查看依赖包的位置
yum -y install deltarpm #安装命令
注:[Errno 14] curl#6 - “Could not resolve host: mirrors.ustc.edu.cn; Unknown error” 正在尝试其它镜像。
检查是否配置dns
vim /etc/sysconfig/network-scripts/ifcfg-ens33
配置DNS
DNS1=8.8.8.8
DNS2=114.114.114.144
mysql安装后,系统中会自动创建mysqld服务文件,目录为
/lib/systemd/system/mysqld.service
可以直接执行以下命令
systemctl start mysqld //开启
systemctl status mysqld //查看状态
systemctl stop mysqld //停止
systemctl restart mysqld //重启
systemctl disable mysqld //禁止开机自动启动
systemctl enable mysqld //允许开机自动启动
这里启动mysql
systemctl start mysqld
mysql安装好后,会默认创建一个临时root密码在 /var/log/mysqld.log 文件中
①进入编辑器
vi /var/log/mysqld.log
:/password
②用grep命令
grep "password" /var/log/mysqld.log
得到 临时密码: ?uc#N.Qul4qS 临时密码复杂不好记,为方便学习,需要修改
mysql -u用户名 -p回车
mysql -uroot -p
① 取消密码复杂度的验证 (默认要求密码中必须包含大小写字母、数字和特殊字符,安全性要求非常高),降低策略要求
set global validate_password_policy=0;
② 取消密码的长度限制 (默认要求密码必须大于8位)
set global validate_password_length=1;
③ 修改root用户的密码为root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
改完后此时mysql数据库的用户名和密码为 root root
此时可以退出mysql,再登录一下看看能否登录成功,这种登录属于本地登录
退出mysql
exit;
①ip地址可以互通
② 开放3306端口
针对这个问题的解决办法:
方法一:防火墙放开3306端口
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
方法二:直接关闭防火墙=放开所有端口
systemctl stop firewalld 关闭防火墙
③ 启动mysql监听3306端口
systemctl status mysql
ps -ef | grep mysql
systemctl start mysqld
④ 允许远程ip
mysql除了自己以外把其他任何ip地址都放入黑名单,不可信任,需要把远程ip放入白名单
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
//授予所有权限 所有仓库.表格 用户 所有ip地址 密码
‘root’@‘192.168.10.43’ root 用户只能在192.168.10.43这个ip地址登录
‘root’@’%’ root 用户可以在任何ip地址登录
⑤ 刷新权限
flush privileges;
数据库连接到虚拟机,需要经过四道关卡:
①服务器是否可以PING通虚拟机IP地址
②3306端口是否被放出去
③MYSQL是否已经启动,3306是否被监听
④远程IP是否被允许
一个数据库中有多个数据仓库(默认自带四个仓库)
show databases;
create database if not exists 数据库名 default charset utf8mb4;
create database if not exists dbtest_1 default charset utf8mb4
utf-8 表示数据可以存中文
用图形工具新建数据库,右击凭证名—新建数据库
用命令/图形工具建数据库的原理都是一样的
每次创建数据库都会在 /var/lib/mysql 目录中创建数据库同名目录
drop database if exists dbtest_1;
use 数据库名;
每个仓库中都有许多表格
show tables;
表格由列(字段)组成,列有列名和数据类型
每一张数据表格对应磁盘中两个文件
/var/lib/mysql/数据库名/表格名.frm 表格结构文件(大小几乎不会变)
/var/lib/mysql/数据库名/表格名.ibd 表格存储数据文件(大小随表格中的数据而增长)
create table if not exists 表名(
字段名1 数据类型 约束,
字段名2 数据类型 约束,
字段名3 数据类型 约束,
字段名4 数据类型 约束,
------
);
①整数
默认是有符号数 signed (有0正1负, 正负取值都有边界)
无符号数 unsigned (取值范围没有正负之分),取值位多一位相当于正数的取值范围*2, 没有负数
int 32位 21亿~(最常用),bigint 64位 几百亿亿
整数类型存入小数会造成数据精度的丢失 (小数部分四舍五入)
② 浮点数
float(n,m) 单精度浮点数,精度不够精确, 占4 byte
double(n,m) 双精度浮点数,精度比float精确, 但也不是100%精确, 占8 byte
decimal(n,m) 定点小数,精度100%精确, 占 n byte
括号中的 n 代表总位数, m 代表小数部分的位数
举例 (5,2) 取值范围 -999.99 ~ 999.99
③ 字符串(使用最多的数据类型)
char(n) – 定长字符串类型, 若字段的取值长度几乎相等, 用char, 无需二次判定
varchar(n) – 可变长字符串类型,若字段的取值长度参差不齐, 用varchar
n代表可容纳的字符个数/字符串的长度
a char(16) – 长度给少了不够, 给多了浪费, 最长只能存16个字符, 如果没有存满16个字符, 仍按16个字符大小分配存储空间
a varchar(16) – 长度给的多也不怕浪费存储空间, 最长只能存16个字符, 若未存满16个字符, 按实际长度分配存储空间
varchar在数据存入的时候会进行判定并根据实际的长度动态计算需要分配的存储空间, 所以varchar性能不如char, 但varchar比char要节约存储空间
④日期和时间
date 格式: ‘年-月-日’
time 格式: ‘时:分:秒’
datetime 格式: ‘年-月-日 时:分:秒’
*注意: 字符串和日期数据都必须放在单引号中, 否则数据会被识别为语法, 造成语法错误!*
⑤ 二进制
⑥其他
自行测试数据取值范围
-- 创建表格
create table if not exists tb_01(
a tinyint
);
-- 插入数据
insert into tb_01(a) values(127);
insert into tb_01(a) values(-128);
-- tinyint代表1个字节=8个bit=00000000
-- 这8位中,第1位是代表正负的符号位(0正1负),后7位代表取值位
-- -2^7 ~ + 2^7 -1 即-128 - 127
create table if not exists tb_02(
a smallint
);
数据存储在磁盘(硬盘中),磁盘空间有上限,磁盘空间以字节为单位
bit 00000000
字节 byte = 8bit
千字节 MB = 1024B
兆字节 KB = 1024MB
吉字节 GB = 1024KB
太字节 TB = 1024GB
拍字节 PB = 1024TB
……
取值范围越大,所占用的存储空间越大,要设置合适的取值范围
第一原则:不能因为怕浪费磁盘空间就选择太小的数据类型
第二原则:在保证数据类型的大小足够的情况下,尽量选择节约磁盘空间的数据类型
① 非空约束 not null
设置了not null的字段在使用insert语法插入数据的时候必须给值,除非用default设置了默认值
desc 表名 -- 查看表结构
② unique 取值必须不同
对于null 不唯一,可以有多个null,除非组合非空约束
create table if not exists tb_04(
a int unique, -- 单独唯一
b int unique -- 单独唯一
-- unique key(a,b) -- a单独不唯一, b单独也不唯一,联合唯一
);
insert into tb_04(a,b) values(25,25);
insert into tb_04(a,b) values(26,26);
-- insert into tb_04(a,b) values(26,25);
-- insert into tb_04(a,b) values(25,25);
desc tb_04;
select a,b from tb_04;
③ 主键约束 primary key
字段取值不能相同,必须唯一
与唯一约束的区别:
一张表中只能有一个主键,对,只能有一个字段设置主键约束,主键是用来构建主键索引树的,能提升查询速度
一张表中只能有一个字段是主键,错,可以是多个字段联合主键 eg:primary key(a,b)
主键一定不能为空(默认不为空),但可以设置自动增长 auto_increment,即使给空,也会自动往下递增
create table if not exists tb_04(
a int primary key auto_increment, -- 主键只能设置一个
b int
);
insert into tb_04(a,b) values(null,20);
insert into tb_04(b) values(25);
insert into tb_04(b) values(26);
insert into tb_04(a,b) values(10,26); -- 手动插入,后面自增从11开始
insert into tb_04(b) values(26);
insert into tb_04(b) values(26);
insert into tb_04(b) values(26);
-- insert into tb_04(a,b) values(6,26); -- 主键不能相同
insert into tb_04(a,b) values(null,27); -- 可以赋值为空,但会自动增长
desc tb_04;
select a,b from tb_04;
④ 外键约束 foreign key
发生在两张表之间 eg: tb_01 和 tb_02
FOREIGN KEY (b) REFERENCES tb_01(a) -- tb_02表的b字段的取值范围参考了tb_01表的a字段的取值范围
tb_01表a(主键)字段中已有的取值, 才能在tb_02表中的b字段中出现,
tb_01表a字段中未出现的取值, 不能在tb_02表中的b(添加外键)字段中出现,
即tb_02 中的b取值范围由tb_01中的a决定(eg: tb_01 对 tb_02 说:我是你爹!)
create table if not exists tb_04(
a int primary key auto_increment,
b int
);
-- a 1 2 3 4
insert into tb_04(b) values(111);
insert into tb_04(b) values(111);
insert into tb_04(b) values(111);
insert into tb_04(b) values(111);
create table if not exists tb_05(
a int default 22,
b int,
FOREIGN KEY (b) REFERENCES tb_04(a)
);
insert into tb_05(b) values(2); -- yes
insert into tb_05(b) values(3); -- yes
insert into tb_05(b) values(4); -- yes
insert into tb_05(b) values(5); -- no
-- insert into tb_05(b) values(6); -- no
desc tb_04;
-- select a,b from tb_04;
select a,b from tb_05;