DBA
1.数据库安装
3.多实例开机自启
cat /etc/rc.local
/my_mysql/3306/mysql_3306 start
grep -tunlp|greo mysql
echo "/my_mysql/3306/mysql_3306 start" >>/etc/rc.local
echo "/my_mysql/3306/mysql_3307 start" >>/etc/rc.local
?
tail -2 /etc/rc.local
4.多实例的登录方式
1.通过mysql.sock套接字文件登录
tree -L 2 /my_mysql/ 查看创建的数据
2.ip+port方式登录(可以用于登录本地mysql,mysql客户端和服务端在一起,此时已经登录了mysql服务端)
mysql -uroot -p -h127.0.0.1 -P3306
也可以用于远程登录mysql(我在北京,登录远在深圳的mysql数据库)
mysql -uroot -p -h深圳数据库服务器的ip -P端口
?
3.cat /my_mysql/3306/mysql_3306.pid
cat /my_mysql/3306/mysql_3306.sock
netstat -tunlp|grep mysql
停止数据库实例,sock文件和pid文件被销毁
/my_mysql/3306/mysql_3306 stop
/my_mysql/3306/mysql_3306 stop
find /my_mysql/ -name *.sock
find /my_mysql/ -name *.pid
?
mysql -S /my_mysql/3306/mysql.sockMYSQmysqladmin
?
?
?
修改mysql多实例密码
mysql -uroot -p -h127.0.0.1 -P3306
#修改密码
mysqladmin -uroot -S /my_mysql/3306/mysql.sock password
#登录实例,必须使用新密码了
mysql -p -S /my_mysql/3306/mysql.mysql
如何远程登录mysql
mysql是客户端、服务端的架构,client、server
mysql的server是安装在linux上的MYSQL服务端进mysql
mysql的客户端,client是什么
mysql原生命令
通过编写代码,连接mysql
python,php脚本尝试登录远程连接
mysql -uroot -p -h10.211.5519 -P3306
没权限,咋办?
进行授权,允许root用户登录
创建远程链接用户
grant all privileges on *.* to root@'10.211.55.%' indentified by 'chaoge778';
刷新权限
flush privileges;
SQL介绍——结构化查询语言
SQL分类:
DQL DATA QUERY LANGUAGE 数据检索语句:select,SQL语言查询的关键字
DML Manipulation 数据操作语言:添加、修改、删除表中的行(数据)insert 插入一条数据
DCL control授权控制:运维重点掌握
创建DDL definition数据定义、数据库(必会)
?
DDL创建
创建数据库,删除数据库,添加表字段,表索引
mysql -p -S /my_mysql
创建数据库lol
数据库里,大小写不敏感(不是不区分大小写)
语法
#内置的SQL关键字全部大写,然后自定义的数据,可以自定义大小写管理
#最简单的缩写方式
create dataBASE lol;
show databases;
DROP DATABASE LOL ;
#比较完善的写法,创建数据库,这个写法就不会出现上述的报错了
create database if not exists lol;
#最完善的写法,包含了数据库的字符集指定,让你的mysql支持utf-8,支持中文,且不敏感大小写
create database if not exists lol default charset utf8 collate utf8_general_ci;
#查看数据库是如何创建的
show create database lol;
?
DQL指定查询用户信息
#查询mysql库中的用户表信息
#进入mysql数据库,查询库中的内容
use mysql;
#查询在哪个库中
select database();
#查看数据库里有多少张表
show tables;
#查看user数据表里的信息
#查看数据表的结构
desc user;
#查看user表中所有的信息
# *表示所有的字段的意思
select * from user;
#指定字段查询 user,host,password
select user,host,password from user;
DML查询数据与大坑注意
DML数据操作
insert
update
delete
删除一些无用的用户数据
delete from 数据库.数据表
delete from mysql.user where user="root" and host="tech\_master01"
select user,host,password from mysql.user;
select user,host,password from mysql.user where user="root";mysql;
delete from mysql.user where user="root" and host="::1";
delete from mysql.user where user="";
?
DCL授权控制
创建mysql的用户,且设置权限
开发创建一个账号,用于连接数据库,以及查看数据库信息
% 表示所有的主机网段,只要公司防火墙允许,可以访问到数据库
create user 名字@'允许登录的主机网段' identified by '密码';
create user yuchao@'%' identified by 'yuchao668';
#查看用户的授权信息
show grants for yuchao@'%';
#默认创建的用户,只有一个usage权限,作用是只能够登录mysql,没有其他权限
给yuchao 用户,添加登录后允许执行DQL的权限,只允许查看mysql数据库下的表信息
使用root用户给yuchao 用户添加权限
授权语句
允许yuchao用户使用grant命令,with grant option
你不希望yuchao用户使用grannt命令,可以不加该参数
?
grant给与的权限 on 数据库。数据表 to 用户@'允许登录的主机';
?
?
grant select on mysql.user to yuchao@"%";
#刷新权限
flush privileges;
?
?
root用户查看yuchao用户的权限信息
grant usage on *.* to "yuchao"@"%" identified by password '*615c6dcc303...'
?
show grants for yuchao@"%";
?
以下是yuchao用户进行登录,且权限查看的操作
mysql -uyuchao -pyuchao668 -h10.211.55.19
查看MYSQL帮助信息
1.查看ddl帮助信息
man ls查看ddl帮助信息? data definition?use
2.查看dcl语句帮助信息
revoke 删除权限#账户管理?Account Management
3.DML语句帮助信息
? data manipulation
Mysql sql解析原理(面试题)
王者荣耀和SQL不得不说的故事
先看DDL和DCL
英雄数据库
分类
创建kings数据库与查看字符集
数据库的创建,kings数据库
名字语法是,不得以数字开通,大小写不敏感(a和A一样都可以出来)
内置的关键字,默认是大写,小写也行
?
严谨的写法
create database if not exists kings default charset utf8 collate utf8_general_ci;
#查看kings的创建信息
show create database kings;
#对结果格式化,以列表展示\G
show create database kings\G
mysql字符集的了解
读写mysql的中文数据,得保证 客户端的编码,mysql的连接客户端,如mysql命令,如navicat的编码,如shell的编码 服务端的编码:linux服务器本身的编码,mysql服务端的编码 统一,一致
查询当前数据库的字符集信息
字符集的作用是,计算机是如何出来,以及展示全世界各种语言的一种方式
#查看包含了char字符的变量
show variables like 'char%'
这里的字符集是不统一的,插入中文数据,就会有乱码存在了,因此需要utf8统一字符集
创建影响数据表
1.查看数据表的2种方式:
show databases like 'k%';
show tables from kings;
2.数据表的名称
坦克 tanks
战士 warrior
#查看创建数据表的语法
? create table
3.创建数据表的语法
create table tb_name(字段名 字段数据类型 ,字段名2 字段数据类型2 )数据表的额外参数;
?
4.完整的创建坦克表
注意:mysql默认关键字大小写不敏感,数据表是严格区分大小写的
引擎后面学习,理解就是,好比汽车有不太类型的发动机,各种发动机有各种优缺点
?
#先进入kings数据库
use kings;
create table if not exists 'tanks'(
id int,
name varchar(100) not null,
skills varchar(255) not null,
)engine=innidb default charset=utf8;
#查看数据表有哪些
show tables;
#查看数据表的创建信息
show create table tanks\G
#查看数据表的结构,与数据内容
desc tanks;
#查看数据
select * from tanks;
#插入表数据
insert into tanks(id,name,skills,price) values(1,“程咬金”,大招回血”,8888),(2,“大鱼庄周”,“免疫所有队友的页面控制”,2888);
drop语句与坦克表
DDL之删除管理
drop #删除无用的数据库drop database if exists lol2;#删除数据表drop table tanks;
趣谈mysql用户权限管理
DCL 用户管理实践data Control Language用户管理SQL学习 #创建用户的语法 create user "用户名“@”允许登录的网段“ identified by '允许该用户登录的密码' #创建普通用户 #限制客户端登录的命令 create user chaochao@'127.0.0.1' identified by "chaochao888" show grants for chaochao@127.0.0.1;grant 添加权限grant 允许执行的权限1,权限2,权限3 on 数据库.数据表 to 用户名@主机 identified by 密码#删除普通用户drop user chaochao@'127.0.0.1';
五、MySQL核心SQL语句实践
1.grant语句实践
1.开发、测试需要连接数据库
开通远程连接的账号,读写数据库
给开发、测试开通一个连接数据库的账号,且只能读写,删除,更新操作的用户
create user
grant 设置权限
#grant语句可以直接创建,且赋值权限给每一个用户
grant select,insert,updata,delete on 数据库.数据表 to 用户名@'%' identified by '密码';
#创建用户且授权
grant select,insert,updata,delete on kings.tanks to 'yuchao'@'%' identified by 'yuchao668';
#查看用户
select user,host,password from mysql.user;
#刷新权限
flush privileges;
2.授权的几大特性
1.权限,轻而易举,不要使用all privileges,尽量指定一个,某几个权限即可
2.主机范围,尽量别用%,尽量给一个局域网的网段,或者限制某一个IP ,即使是需要在公网环境中连接,使用%,也得通过防火墙做一定的安全措施,以及更换mysql默认端口等等。
1.root登录密码复杂
2.更改ssh端口
3.禁止root登录,只允许普通用户登录
4.禁止用账号密码登录
5.只能普通用户+公私钥的形式登录
6.修改常见软件的默认端口,如3306,6379等等
7.grant授权对数据库的选择,也尽量别用*,而指定数据库以及数据表
3.通过后端代码,远程连接mysql
php读写mysql
shell
安装php,依赖
centos7平台先安装php,以及php读写mysql的一个驱动
yum install php-mysqlnd php -y
读取mysql数据的php脚本
<?php?>
Python读写mysql
1.安装解释器python3,就和bash解释器是一样的yum install python3 python3-devel -y,#开发python3脚本即可python3读写mysql,就得有一个桥梁,有一个驱动让python3 可以正确的连接上mysql通过如下命令安装这个驱动 pymysql#开发python3读写mysql的脚本
4.修改坦克表之alter语句
1.rename修改数据表的名字
rename table 旧的表名字 to 新的表名字rename table tanks to Tanks;
2.alter命令修改数据表的名字
alter table 当前表名 rename to 新表名;alter table Tanks rename to TANKS;
3.修改数据表的字段
introductrion 具体的介绍信息
alter指令
#语法
alter table 表名 add 字段名 字段的数据类型(长度) 额外的字段属性;
alter table tanks add introduction varchar(255) not null;
4.添加指定位置的字段
枚举类型:二选一的字段
添加到skills字段后面
添加after指令,指定插入到哪个字段后面
alter table tanks add summoner_skills ENUM('flush','fire') not null default 'flush' after skills;
5.一次性添加多个字段
英雄的阵营、图片头像
camp
pic
希望字段顺序是:
#修改表字段的语句是
alter table tanks add camp varchar(50) after price,add pic varchar(255) after camp;
6.删除table的字段
alter 结合drop删除字段alter table 表名 drop 字段alter table tanks drop summoner_skills;
7.修改表字段的类型
修改table字段的数据类型语句 pic的varchar改为char类型alter table 表名 change 旧字段名 新字段名 新数据类型;alter table tanks change pic pic_url char(200);
mysql数据表的索引创建
索引的查看与添加,与删除
1.查看索引
primary key 是主键,也是属于一个索引 index的作用1.查看数据表的索引信息show index from mysql.user\G;
2.添加索引
给name字段,添加索引
语法:alter table tanks add index 索引的名(哪个字段);alter table tanks add index name_index(name);
3.删除索引
alter table tanks drop index name_index;
数据表的删除
1.删除基础语法
#删除数据库语法
drop database 数据库名;
#删除数据表语法
drop table 表名;
2.删除数据表之delete语句
语法:
delete from 删除数据表的内容
delete from 可以结合where条件语句,进行数据的指定删除,判断删除
delete是一行一行的删除数据,对于大容量的数据表删除效率很低
delete对于有自增id的列,数据删除后,会保留其id的位置
比如说清空tanks表的数据()
保留id 的意思:发现id是primary key,主键的意思是(非空且唯一)
delete对于有自增id的列,数据删除后,会保留其id的位置
#没有自增属性
给坦克表的id添加自增属性modify
给id列,添加自增属性,再来看看,数据的删除,插入,结果是怎样的#修改指令,修改字段的数据类型#自增的意思是,每一个数据插入后,自动的id+1操作alter table tanks modify id int(11) auto_inctement;
删除之tuncate语法
truncate语句直接清空表数据,重新建立一个表
不会出现自增id 的问题,重新计算id位置
truncate table tanks;
坦克表的数据查询
1.通过*查询
select * from tanks;
2.通过字段查询
只想查看鲁班的技能和价格
select skills,price from tanks where name="鲁班";
limit 限制条目数量
插入测试的数据
insert into tanks(name,skills)values(“阿古朵”,“骑在一个球上面”)
限制只看2条数据
select * from tanks where price >3000 limit 2;
limit 语法
limit 起点,条数;
where指定条件搜索数据
查询某一个数据
找到id为5的数据
select * from tanks where id=5;
select * from tanks where id>4 and price >8000;
结果排序(默认升序,从小到大)
select id,name,skills,price,camp from tanks where price >4000 order by price;(升序)
select id,name,skills,price,camp from tanks where price >4000 order by price desc;(降序)
修改表数据update
修改猪八戒的价格为7999
updata kings.tanks set price=7999 where name="猪八戒";
#修改多个属性
updata kings.tanks set price=17999,summoner_skills="fire" where name="猪八戒";
#不要踩坑,注意需要添加条件where
这个坑只能手动谢盖条目,或者有数据备份,否则你就收拾铺盖,回家搬砖!
mysql数据备份
1.数据库备份
数据库需要备份
以及全网的服务器,业务数据也需要备份
如网页的静态数据,代码,日志等
2.mysql数据库如何备份
备份就是mysql的各种数据库(database)
以及库内的各种数据表(table)
(1) 只备份每一个库,不备份里面的表
(2)备份所有的库,和里面的表,但是不要表里的数据,只备份他的机构(创建的SQL)
(3)只要某一个库,以及这个库中的所有表,以及所有的数据
(4)只要某一个库,里面的某一张表
3.mysqldump命令
mysqldump命令是把数据的执行SQL,进行导出的作用,导出的数据以SQL文件的形式存储
这个文件就可以发给其他机器,去执行,也就是恢复数据的意思
语法
-B 等于 --database 作用是指定备份某一个,某几个库
mysqldump -u用户名 -p密码 -B kings lol>/home/kings_lol.sql
mysql -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock -B kings lol > /home/kings_lol.sql
mysqldump 的备份原理:
备份过程就是mysqldump指定的数据库以及表,以SQL文件的形式进行输出,这种备份方案称之为逻辑备份。
在海量数据的备份情况下,mysqldump逻辑备份就不适用了,如几十GB,以至于更大的数据流进行备份,恢复,就不合适了,因此还有其他的数据备份方案。
mysqldump备份方案
2.备份方案与gzip压缩
mysql -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock -B kings lol |gzip >/home/kings_lol.sql.gz
3.分库、分表备份
(1)指定备份单个table,多个table
语法如下
#指定数据表的备份,就不能用-B参数
mysqldump -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock kings tanks fuzhu |gzip > /home/kings_tanks_fuzhu.sql.gz
(2)只要table结构,no data
1.备份库下所有的表结构 -d选项的用法=--no-data
mysqldump -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock -d kings |gzip >/home/kings_all_table_no_data.sql.gz
(3)指定备份某张表的结构,只备份坦克表
mysqldump -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock -d kings tanks|gzip >/home/kings_tanks_no_data.sql.gz
(4)只备份kings下表的数据
只要表数据,不要结构
利用-t参数,不写入表的创建sql,只写入数据的插入sql
-t = --no-create-info
mysqldump -uroot -pchaoge888 -S /my_mysql/3306/mysql.sock -t kings tanks > /home/kings_tanks_data.sql
grep -EV '#|\*|--|^$'
还有不指定表,默认是所有的表数据,kings数据库下
mysql数据恢复,数据导入
1.source恢复sql
mysql内置了source命令,可以读取sql文件,进行数据恢复,说白了就是重新执行SQL,对数据进行创建的操作
2.重定向导入数据
利用mysql的 登录命令,进行重定向数据导入,一定要指定从哪个数据库内导入该SQL
语法:
mysql -uroot -p < /home/kings_tanks.sql