建议大家使用二进制的包安装,已经过了cmake阶段,已经把bostorg装好了
[root@db02 mysql-5.7.20]# yum install -y gcc gcc-c++ automake autoconf
[root@db02 mysql-5.7.20]# yum install make cmake bison-devel ncurses-devel libaio-devel
[root@db02 mysql-5.7.20]# wget httpss://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_59_0.tar.gz
#登录boost.org下载也可以
[root@db02 mysql-5.7.20]# tar xf boost_1_59_0.tar.gz -C /usr/local/
[root@db02 mysql-5.7.20]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.7.20 \
-DMYSQL_DATADIR=/application/mysql-5.7.20/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.20/tmp/mysql.sock \
#安装bostorg
-DDOWNLOAD_BOOST=1 \
#安装的目录
-DWITH_BOOST=/usr/local/boost_1_59_0 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
#5.6初始化命令
/service/mysql/scripts/mysql_install_db --user= --basedir= --datadir=
#5.7初始化命令
/usr/local/mysql/bin/mysqld --initialize --user= --basedir= --datadir=
#初始--initialize会生成一个临时的随机密码,他会告诉你位置,你自己去找使用密码登录,而且修改密码也需要一个很复杂的密码,大小写数字特殊符号
#想不让他生成密码的话,还可以用另外一个参数--initialize-insecure
linux系统 | mysql数据库 | |
---|---|---|
用户作用 | 1.登陆系统 2.管理系统文件 | 1.登陆MySQL数据库 2.管理数据库对象 |
创建用户 | 1.useradd 2.adduser | 1.create user test@’%’; 2.grant |
用户密码 | 1.useradd cm -p 123 2.passwd cm | 1.create user test@’%’ identified by ‘123’; 2.mysqladmin |
删除用户 | userdel | 1.drop user test@’%’; 2.delete |
修改用户 | usermod | update |
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | db01 |
| root | db01 |
| | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)
#上面是6个用户,在数据库中一个完整的用户是:'用户名'@'主机域'
'用户名'@'主机域'
主机域写法:
localhost
127.0.0.1
10.0.0.%
10.0.%.%
10.%.%.%
%
10.0.0.5%(10.0.0.50-10.0.0.59)
db01
10.0.0.0/255.255.255.0
10.0.0.0/24 #可以创建但是不生效
测试:
grant all on *.* to lhd@'10.0.0.0/255.255.255.0' identified by '123';
grant all on *.* to qiudao@'10.0.0.0/24' identified by '123';
#创建的用户是数字,必须用引号一起来表示字符串
mysql> create user 123@'localhost';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123@'localhost'' at line 1
mysql> create user '123'@'localhost';
Query OK, 0 rows affected (0.02 sec)
mysql> create user lhd@'10.0.0.%' identified by '123';
mysql> select user,host from mysql.user;
mysql> drop user oldboy@‘10.0.0.%’;
1.mysqladmin -uroot -p123 password '1'
2.update mysql.user set password=password('123') where user='root' and host='localhost';
3.set password=password('1'); 修改当前用户的密码
4.grant all on *.* to 'root'@'localhost' identified by '123';
1.停止MySQL
[root@db01 data]# /etc/init.d/mysqld stop
2.跳过授权表,安全启动
[root@db01 data]# mysqld_safe --skip-grant-tables --skip-networking &
3.连接数据库
[root@db01 data]# mysql
4.update修改密码
mysql> update mysql.user set password=password('123456789') where user='root' and host='localhost';
5.刷新授权表
mysql> flush privileges;
6.重启数据库
[root@db01 data]# /etc/init.d/mysqld restart
7.使用新密码链接数据库
[root@db01 data]# mysql -uroot -p567
#授权命令
grant all privileges on *.* to oldboy@'10.0.0.%' identified by '123';
grant all on *.* to oldboy@'10.0.0.%' identified by '123';
授权SQL 所有权限 在 所有库.所有表 上面 给 用户名@主机域 密码 为 123;
grant all privileges on *.*
grant select,update,insert on mysql.* 单库
grant select,update,insert on mysql.user 单表
#企业里称单列授权为 脱敏:脱离敏感信息
grant select(user,host) on mysql.user to ptuser@'%' identified by '123'; 单列级别
#举例:(相亲网站)
grant select on mysql.user to vip@'%' identified by '123';
grant select(user) on mysql.user to diaosi@'%' identified by '123';
#开发人员说:请给我开一个用户
#1.首先进行沟通
1.你需要对哪些库、表进行操作
2.你从哪里连接过来
3.用户名有没有要求
4.密码要求
5.你要使用多长时间
6.发邮件
#2.一般给开发创建用户权限
grant select,update,delete,insert on *.* to oldboy@’10.0.0.%’ identified by ‘123’;
#建议delete权限也不给
#3.注意:开发想要root用户,打死也不能给,这个申请到谁那里批准,也不给,让老大给
#创建wordpress数据库
create database wordpress;
#使用wordpress库
use wordpress;
#创建t1、t2表
create table t1 (id int);
create table t2 (id int);
#创建blog库
create database blog;
#使用blog库
use blog;
#创建t1表
create table tb1 (id int);
#给wordpress@'10.0.0.5%'用户查询所有库,所有表的权限,密码是 123
1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;
#给wordpress@'10.0.0.5%'用户插入,删除,修改 针对wordpress库下的所有表 密码是123
2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;
#给wordpress@'10.0.0.5%'用户所有权限针对wordpress库下的t1表 密码是123
3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;
一个客户端程序使用wordpress用户登陆到10.0.0.51的MySQL后,
1、对t1表的管理能力? all
2、对t2表的管理能力? select insert,delete,update 增删改查
3、对tb1表的管理能力? select
1、如果在不同级别都包含某个表的管理能力时,权限是相加关系。
2、但是我们不推荐在多级别定义重复权限。
3、最常用的权限设定方式是单库级别授权,即:wordpress.*
4、如果涉及到用户的敏感信息,需要做脱敏,单列级别授权 即:select(列名) 单库.单表
mysql
#常见的特定于客户机的连接选项:
-u: 指定用户 mysql -uroot
-p: 指定密码 mysql -uroot -p567
-h: 指定主机域 mysql -uroot -p567 -h127.0.0.1
-P: 指定端口 mysql -uroot -p567 -h127.0.0.1 -P3307
-S: 指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e: 指定SQL语句(库外执行SQL语句)
< : 导入sql脚本
mysql -uroot -p567 -e "show databases;"
#--protocol: 指定连接方式 mysql --protocol=TCP --protocol=socket
#show processlist; #可以查看本次连接数据库是本地连接还是远程连接(具体见下图)
1.sqlyog
2.navicat
#注意:数据库是没有外网的,想连接可以使用通道
3.应用程序连接MySQL
#注意:需要加载对应语言程序的API
mysql -uroot -poldboy123 -S /service/mysql/tmp/mysql.sock
mysql -uroot -poldboy123
mysql -uroot -poldboy123 -h10.0.0.51 -P3306
#1.源码安装:编译过程中cmake去指定设置初始化参数,硬编码到程序当中去
#2.配置文件:数据库启动之前,设定配置文件参数===》/etc/my.cnf
#3.启动脚本命令行===》mysqld_safe --skip-grant-tables --skip-networking &
#1./etc/my.cnf
#2./etc/mysql/my.cnf
#3.$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
#4.defaults-extra-file (类似include)
#5.~/.my.cnf
#1.~/.my.cnf
#2.defaults-extra-file (类似include)
#3.$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
#4./etc/mysql/my.cnf
#5./etc/my.cnf
#配置/etc/my.cnf
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
#配置/etc/mysql/my.cnf
[root@db01 ~]# mkdir /etc/mysql
[root@db01 ~]# vim /etc/mysql/my.cnf
[mysqld]
server_id=2
#配置$basedir/my.cnf
[root@db01 ~]# vim /service/mysql/my.cnf
[mysqld]
server_id=3
#配置~/my.cnf
[root@db01 ~]# vim ~/.my.cnf
[mysqld]
server_id=4
#重启数据库(注意这里不能使用systemctl restart mysql重启)
[root@db01 ~]# systemctl stop mysql
[root@db01 ~]# /etc/init.d/mysqld start
#查看server_id
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 4 |
+---------------+-------+
1 row in set (0.00 sec)
#cmake:
socket=/service/mysql/tmp/mysql.sock
#命令行:
--socket=/tmp/mysql.sock
#配置文件:
vim /etc/my.cnf
[mysqld]
socket=/opt/mysql.sock
#default参数:
--defaults-file=/tmp/a.txt
vim /tmp/a.txt
[mysqld]
socket=/tmp/test.sock
#启动测试
mysql_safe --defaults-file=/tmp/a.txt --socket=/tmp/mysql.sock
优先级测试结论:
1、命令行
2、defaults-file
3、配置文件
4、预编译
命令行 >> defaults-file >> ~/.my.cnf >> defaults-extra-file >> $basedir/my.cnf >> /etc/mysql/my.cnf >> /etc/my.cnf >> cmake
#1.影响服务端的启动(mysqld)
#2.影响客户端的连接
[root@db01 scripts]# vim /etc/my.cnf
#最下面添加
[client]
user=root
password=123
#不需要重启和输入密码就可以直接连数据库
1.客户端程序也是受到配置文件的影响 [mysql] && [client]
2.修改完客户端的配置,不需要重启
3.修改完服务端的配置,必须重启,才能生效 [mysqld] && [server]
[root@db01 ~]# cat /etc/my.cnf
[mysqld] #服务器端标签
user=mysql #负责数据库管理用户
basedir=/service/mysql #软件的安装位置
datadir=/data/3308/data #数据的存放位置
port=3306 #端口号
socket=/data/3308/mysql.sock #套接字文件
server_id=6 #标识节点的唯一编号(主从有用)
[mysql] #客户端标签
socket=/tmp/mysql.sock #读取socket文件的位置点
注释:配置文件通用格式:
[标签]
配置参数=XXX
标签是什么?
区分不同程序参数的。
[服务器端]:影响数据库服务端运行
[mysqld]
[mysqld_safe]
[server]
[客户端]:影响本地客户端连接,不影响远程客户端
[mysql]
[mysqldump]
[client]
#1.MySQL启动流程:
/etc/init.d/mysqld start------> mysql.server ------> mysqld_safe ------> mysqld
启动命令 调用文件 调用文件 启动服务
systemctl start mysql ------> mysqld_safe ------> mysqld
启动命令 调用文件 启动服务
mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld
启动命令 调用文件 启动服务
/etc/init.d/mysqld stop
systemctl stop mysqld
service mysqld stop
mysqladmin -uroot -p123 shutdown
mysqladmin --socket/data/3307/mysql.sock -uroot -p123 shutdown #多实例指定端口号停止数据库
mysql -uroot -p123 -e "shutdown"
#不建议使用
kill -9 pid
killall mysqld
pkill mysqld
#出现问题:
1.如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2.号称可以达到和Oracle一样的安全性,但是并不能100%达到
3.在业务繁忙的情况下,丢数据(补救措施,高可用)
\c:中断当前输入语句
\r:重新连接到服务器
\d:设置语句sql结束符 mysql> \d ]
\e:编辑命令 输出输入的内容 echo
\p:打印当前命令并执行
\G:垂直显示结果
\q:退出mysql 等于 quit exit
\g:表示结束 等于 ; 的作用
\h:显示此帮助 等于 help #help还可以查看命令语法 help create database;
\t:不写入outfile
\T:将所有内容附加到给定的输出文件中(只支持本次会话) \T /tmp/a.log
#\n:禁用寻呼机,打印到标准输出。
#\P:设置寻呼机[到寻呼机]。通过寻呼机打印查询结果。
\R:更改mysql提示符 \R mysql>>>
\.:执行一个sql文件 等于 source
\s:从服务器获取状态信息 等于 status
\u:切换数据库 等于 use #查看当前所在数据库select database();
\C:切换到另一个字符集 一般不使用
\W:在每个语句后显示警告
\w:不在每个语句后显示警告
mysql> help
mysql> help contents help 用法
mysql> help select
mysql> help create
mysql> help create user
mysql> help status
mysql> help show
1.修改密码,设置密码:password
[root@db01 ~]# mysqladmin -uroot -p旧密码 password '新密码'
2.关闭MySQL服务:shutdown
[root@db01 ~]# mysqladmin -uroot -p密码 -S socket文件 shutdown
3.库外建库:create
[root@db01 ~]# mysqladmin -uroot -p密码 create lhd
[root@db01 ~]# mysql -uroot -p123456 -e 'create database lhd'
4.库外删除数据库:drop
[root@db01 ~]# mysqladmin -uroot -p123456 drop lhd
Do you really want to drop the 'lhd' database [y/N] y
Database "lhd" dropped
5.查看配置文件所有的默认参数:variables
[root@db01 ~]# mysqladmin -uroot -p123456 variables
[root@db01 ~]# mysqladmin -uroot -p123456 variables | grep server_id
6.检测MySQL进程是否存活:ping
[root@db01 ~]# mysqladmin -uroot -p123456 ping
7.查看数据库 慢查询,负载信息:status
[root@db01 ~]# mysqladmin -uroot -p123456 status
Uptime MySQL服务器已经运行的秒数
Threads 活跃线程(客户)的数量
Questions 从mysqld启动起来自客户问题的数量 已经发送给服务器的查询的个数
Slow queries 已经超过long_query_time秒的查询数量
Opens mysqld已经打开了多少表
Flush tables flush ..., refresh和reload命令数量
Open tables 现在被打开的表数量
Queries per second avg: 0.046 负载
8.重载授权表,刷新缓存主机:reload,相当于flush privileges
[root@db01 ~]# mysqladmin -uroot -p123456 reload
9.刷新binlog日志
[root@db01 ~]# mysqladmin -uroot -p123456 flush-log
DDL:Data Query Language 数据定义语言(CREATE、DROP、ALTER)
DCL:Data control Language 数据控制语言(GRANT,ROLLBACK,COMMIT)
DML:Data Manipulation Language 数据操作语言(INSERT,UPDATE,DELETE)
DQL:Data Query Language 数据查询语言(SELECT)
#DPL:事务处理语言(BEGIN TRANSACTION、COMMIT和ROLLBACK)
实例===》库===》表===》字段、记录、索引
#1.使用help查看语句
mysql> help create database;
CREATE {
DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name
#2.创建oldboy数据库
mysql> create database lhd;
mysql> create schema lhd;
#3.创建已存在数据库时会报错
mysql> create database if not exists lhd;
#4.查看建库语句
mysql> show create database mysql;
mysql> show create database lhd;
#5.创建数据库并制定字符集和校验规则
mysql> create database if not exists lhd collate utf8_general_ci charset utf8; #如果不存在就创建,存在就不创建
#6.删库:
mysql> drop database lhd;
#7.修改库:
mysql> alter database bgx1 charset utf8mb4;
mysql> help create table;
mysql> create table qiudao(id int);
mysql> create table if not exists qiudao(id int); #如果不存在就创建,存在就不创建
#若建表出现提示没有指定数据库的错误====》用类似于绝对路径来解决
mysql> create table lhd(id int,name varchar(10),gender enum('man''girl'),zctime datatime);
ERROR 1046 (3D000): No database selected
mysql> mysql> create table lhd.lili(id int,name varchar(10),gender enum('man''girl'),zctime datetime);
Query OK, 0 rows affected (0.04 sec)
int: 整数 -2^31 ~ 2^31 -1
tinyint: 最小整数 -128 ~ 127 #一般年龄使用
varchar(50): 字符类型 (变长) #一般身份证使用该类型
char(50): 字符类型 (定长) #KVM的磁盘格式:RAW:定长 QCOW2:变长
enum: 枚举类型 #性别使用,指定多项选其一
datetime: 时间类型 年月日时分秒
#timestamp 以前使用
#注意:当tinyint类型被指定非负数时,值会变,但范围不改不变
#查看qiudao表的属性
mysql> desc qiudao;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
#插入数据,插入数据为10位可以,11位不可以
mysql> insert into qiudao values(11111111111);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into qiudao values(1111111111);
Query OK, 1 row affected (0.01 sec)
#插入数据的最大值不能大于2的31次方
mysql> insert into qiudao values(2147483648);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into qiudao values(2147483647);
Query OK, 1 row affected (0.00 sec)
#插入数据的负的最大值不能小于-2的31次方
mysql> insert into qiudao values(-2147483649);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into qiudao values(-2147483648);
Query OK, 1 row affected (0.01 sec)
#建表
mysql> create table qiudao2(id int,name varchar(10),gender enum('male','fmale','qiudao'));
Query OK, 0 rows affected (0.01 sec)
#查看qiudao2表的属性
mysql> desc qiudao2;
+--------+-------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | enum('male','fmale','qiudao') | YES | | NULL | |
+--------+-------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#添加数据,性别选项只能填他给的选项,其他的不行
mysql> insert into qiudao2 values(1,'qiudao','nan');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> insert into qiudao2 values(1,'qiudao','male');
Query OK, 1 row affected (0.00 sec)
#建一个新表
create table qiudao3(
id int,
name varchar(10),
age tinyint,
gender enum('f','m'),
cometime datetime);
#插入一个数据,now()函数表示当前时间
mysql> insert into qiudao3 values(1,'qiudao',88,'f',now());
表名:student
sid
sname
sage
sgender
scometime
create table student(
id int,
name varchar(10),
age tinyint,
gender enum('f','m'),
cometime datetime);
not null: 非空
primary key: 主键(唯一且非空的) #一套数据可以反复插入,没有主键的表没有意义
auto_increment: 自增(此列必须是:primary key或者unique key)
unique key: 单独的唯一的
default: 默认值
unsigned: 无符号,非负数
comment: 注释
#唯一键与主键的区别,主键只能有一个不能为空,唯一键可以是多个可以为空,设置多个唯一键再加上非空属性可以当做多个主键,主键查询的速度快
primary key = unique key + not null
#建表加上数据属性
mysql> create table lhd.student(
-> id int not null primary key auto_increment comment'学号',
-> name varchar(10) not null comment'姓名',
-> age tinyint unsigned not null comment'年龄',
-> gender enum('man','girl') not null default 'man' comment'性别',
-> cometime datetime default now() comment'入学时间',
-> birthday datetime comment'生日',
-> class varchar(10) not null comment'学生班级');
#查看建表语句
mysql> show create table student;
#插入表数据
mysql> insert into lhd.student values('1','fxs','18','girl',now(),now(),'linux11');
Query OK, 1 row affected (0.00 sec)
#查看插入的表数据
mysql> select * from lhd.student;
+----+------+-----+--------+---------------------+---------------------+---------+
| id | name | age | gender | cometime | birthday | class |
+----+------+-----+--------+---------------------+---------------------+---------+
| 1 | fxs | 18 | girl | 2021-02-25 10:46:23 | 2021-02-25 10:46:23 | linux11 |
+----+------+-----+--------+---------------------+---------------------+---------+
1 row in set (0.00 sec)
mysql> drop table student;
#先创建一个表
mysql> create table students(zzy varchar(10));
Query OK, 0 rows affected (0.01 sec)
#修改表名
mysql> alter table students rename stu;
#添加列和列定义
mysql> alter table stu add zy varchar(10);
mysql> alter table stu add age int;
#添加多个列
mysql> alter table stu add qiudao varchar(20),add gcc int;
mysql> alter table stu add test varchar(20),add qq int;
#指定位置进行添加列(表首)
mysql> alter table stu add dsb varchar(20) first;
mysql> alter table stu add classid varchar(20) first;
#指定位置进行添加列(指定列)
mysql> alter table stu add ggj int after zy;
mysql> alter table stu add phone int after age;
#删除指定的列及定义
mysql> alter table stu drop zy;
mysql> alter table stu drop qq;
#修改列及定义(列属性)
mysql> alter table stu modify zzy varchar(10);
#修改列及定义(列名及属性)
mysql> alter table stu change zzy lhd char(20);
#导入之前备份的数据到数据库内
[root@web03 ~]# mysql -h 127.0.0.1 -P 3307 -u root -p1 < /usr/local/packages/world.sql #在数据库外导入
mysql> source /usr/local/packages/world.sql #在数据库内利用source命令导入