mysql进阶(一)

1.linux下安装与卸载

1.查

rpm -qa | grep -i mysql

在这里插入图片描述

2.删

yum remove mysql-common-8.0.17-3.module_el8.0.0+181+899d6349.x86_64

mysql进阶(一)_第1张图片
3.查文件

find / -name mysql

mysql进阶(一)_第2张图片
4.删文件

rm -rf /var/lib/mysql

5.删除配置文件

rm –rf /usr/my.cnf
rm -rf /root/.mysql_sercret

6.删除mysql开机自启动服务(我没设)

chkconfig --list | grep -i mysql #查看mysql的服务
chkconfig --del mysqld #服务名为你设置时候自己设置的名字

2、下载rpm包

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

# 如果提示需要账号密码,就用这个方式下载
# wget [email protected] --http-passwd=yourpassword https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

2、查看系统是否自带mariadb
rpm -qa | grep mariadb

3、将查出的mariadb进行卸载
rpm -e --nodeps mariadb-libs-5.5.64-1.el7.x86_64

4、把刚刚下载的mysql tar解压
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

5、在解压目录安装如下4个mysql核心包
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

6、安装到server时缺少依赖报错
error: Failed dependencies:
        libaio.so.1()(64bit) is needed by mysql-community-server-5.7.28-1.el7.x86_64
        libaio.so.1(LIBAIO_0.1)(64bit) is needed by mysql-community-server-5.7.28-1.el7.x86_64
        libaio.so.1(LIBAIO_0.4)(64bit) is needed by mysql-community-server-5.7.28-1.el7.x86_64

7、安装缺少的依赖
yum -y install libaio

8、再次安装server
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

9、启动mysql服务
service mysqld start

10、查看v5.7版本的默认登录密码
grep password /var/log/mysqld.log

11、登录到mysql命令行,修改默认密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

12、会告诉你密码不符合规范,可以修改校验等级和长度后再次执行上面的语句
set global validate_password_policy=LOW;
set global validate_password_length=6; 

13、账户授权
use mysql;
select host,user from user;

# 只有内网网段ip才可访问,并授权账号可以授权其他人
# grant all privileges on *.* to gavin@'192.168.%' identified by '123456' with grant option;
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
#说明:此命令是为密码为 root 、IP(%)任意的 root 用户授权。(%:模糊查询,所有 IP 都可以,,可指定其他主机 IP;BY 后的 'root' 为
#密码)
flush privileges;  # 将配置写入 mysql 授权表中

2.sql执行顺序

插入数据 测试

create database icoding_admin;

DROP TABLE IF EXISTS `ad_role`;

CREATE TABLE `ad_role` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `ad_role` (`id`, `role_name`)
VALUES
	(1,'vip1'),
	(2,'vip2'),
	(3,'vip3');
	
DROP TABLE IF EXISTS `ad_user`;

CREATE TABLE `ad_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL DEFAULT '',
  `password` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `ad_user` (`id`, `username`, `password`)
VALUES
	(1,'arry','123456'),
	(2,'gavin','1234567'),
	(3,'coding','123456');
	
DROP TABLE IF EXISTS `ad_user_role`;

CREATE TABLE `ad_user_role` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `ad_user_role` (`id`, `user_id`, `role_id`)
VALUES
	(1,1,1),
	(2,1,2),
	(3,1,3),
	(4,2,2),
	(5,3,3),
	(7,2,3);

SQL执行顺序

  • FROM
  • ON
  • JOIN
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • ORDER BY
  • LIMIT

where执行 mysql是 左–》右

mysql进阶(一)_第3张图片
8.0去掉了缓存

3.常用引擎

mysql进阶(一)_第4张图片

mysql进阶(一)_第5张图片

# 查询表的引擎
show table status like '%ad_user%' \G;

cd /var/lib/mysql
# 这个目录下存放的是数据库对应的各个数据库的数据文件 如图 备份直接拷走就可以   
默认配置
vi /etc/my.cnf

exit  退出mysql

mysql进阶(一)_第6张图片

4.日志

- 错误日志

show variables like '%log_error%';

mysql进阶(一)_第7张图片
mysql进阶(一)_第8张图片

# log_warnings= 0| 1| 2 
# 0 关闭
# 1 开启-default
# >1 失败的连接,拒绝访问的错误也会记录

- 查询日志

查询日志会将所有数据库的操作都会记录(general log 通用日志)

消耗I/O,默认不开
mysql进阶(一)_第9张图片
mysql进阶(一)_第10张图片
log_output=FILE
FILE、TABLE、FILE,TABLE、NONE

- 慢查询日志
mysql进阶(一)_第11张图片

show variables like '%slow%';
[mysqld]
slow_query_log=ON
slow_launch_time=4
long_query_time=3
slow_query_log_file=/usr/local/slow.log
改路径要授权
chown -R mysql:mysql /usr/local/

select sleep(3),user from user;

mysql进阶(一)_第12张图片
默认不开
手动开启

restart mysqld.service 改完配置重启

mysql进阶(一)_第13张图片

选择数据库
use icoding_admin
show tables;
直接看不推荐
# 根据时间降序
mysqldumpslow -s -t /var/lib/mysql/DB213-slow.log
# 根据记录数降序
mysqldumpslow -s -r /var/lib/mysql/DB213-slow.log
# 根据执行次数降序
mysqldumpslow -s -C /var/lib/mysql/DB213-slow.log
# 帮助手册
mysqldumpslow --help

在这里插入图片描述

  • 二进制日志:binlog
    这个是数据库中最重要的日志,会记录所有DML,不会记录select

  • 事务日志

  • 中继日志 reply log

5.备份与恢复

mysql进阶(一)_第14张图片
需要开binlog日志

binlog三种模式

  • statement

纯粹的记录DML的语句
update ad_user set username=‘gavin.huang’ where id=1;
delete from ad_user where id=1;
如果误删 这个是看不出来删的数据 找回就需要全量jump 找个空库增量都跑一遍找到删除数据

mysql进阶(一)_第15张图片

# statement
在usr/local目录下
mkdir binlog
# chown -R mysql:mysql /usr/local/binlog/   授权
# MySQL会自动生成一个mysql-bin-00001.log
log_bin=/usr/local/binlog/mysql-bin
binlog_format=statement
# binlog日志切割的大小
max_binlog_size=500m
# binlog过期清理时间
expire_logs_days=3

[mysqld]
server-id=213

mysql> show binlog events in 'mysql-bin.000001';

开启binlog
mysql进阶(一)_第16张图片
mysql进阶(一)_第17张图片

  • row(5.7默认)
    row只需改配置文件的binlog_format=statement
    mysql进阶(一)_第18张图片# row模式的日志查询 mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000002
    查询结果
### DELETE FROM `icoding_admin`.`ad_user`
### WHERE
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='coding' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
###   @3='123456' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */

### UPDATE `icoding_admin`.`ad_user`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='gavin' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
###   @3='1234567' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='gavin.huang' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */
###   @3='1234567' /* VARSTRING(150) meta=150 nullable=0 is_null=0 */

定位错误

mysqlbinlog --base64-output=decode-rows --start-datetime='2020-06-17 22:10' --stop-datetime='2020-06-17 22:25' -vv mysql-bin.000002
  • mixed

混合模式
statement:95%

全量备份

差异备份

增量备份
mysql进阶(一)_第19张图片
时间点备份

备份类型

  • 热备:热备是不能通过简单的copy命令
  • 温备:只能进行读操作
  • 冷备
  • 物理备份:copy文件
  • 逻辑备份

常用备份工具

  • mysqldump
  • Percona提供的xtrabackup
# mysqldump --help
# --master-data 0(不记录position) 1(记录position位置) 2(记录position位置并注释该条)
# routines 存储过程
# triggers 触发器
# events 事件
# single-transaction
# --ignore-table=icoding_admin.ad_user_role --ignore-table=icoding_admin.ad_user
# 基于innodb引擎
mysqldump -uroot -p123456 -h127.0.0.1 --master-data=2 --routines --triggers --events --single-transaction --databases icoding_admin --ignore-table=icoding_admin.ad_user_role > mydb.sql

在想要备份的目录下执行

为什么用–single-transaction

该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。

数据恢复

数据恢复要全量备份和增量一起用
1.全量备份 使用crontab 结合mysqldump做定时备份

首先写脚本
crontab -e
16 20 * * * rm -rf /usr/local/bak/bak.sql  #前面是定时时间   什么时间删除
18 20 * * * mysqldump -uroot -p123456 --databases icoding_admin > /usr/local/bak/bak.sql #什么时间全量备份

通过之前设置可得到全量备份bak.sql

增量备份
开启binlong statement/row/mixed
# 场景1:如果数据量小,比如关键的某一条数据,row模式下可以直接手工处理
mysqlbinlog --base64-output=decode-rows --start-position=9623 --stop-position=9858  -vv mysql-bin.000002
# 场景2:数据量特别大,需要导出进行处理
mysqlbinlog --start-position=9623 --stop-position=9858 mysql-bin.000002 > ist.sql

得到增量ist.sql

执行全量之后执行增量如下
# 增量数据的恢复根据需要把当前binlog记录关掉
mysql> set sql_log_bin=0;
mysql> source ist.sql

6.mysql优化

# 执行计划
explain select * from pms_product where id=1;
# 组合索引一定是最左匹配原则
# 如果你在表上建立了很多组合索引,索引文件膨胀,修改、删除、更新会比较慢

在这里插入图片描述

  • 如何保证数据库死而不僵

    • show processlist;
    • kill id;
  • 适合建立的列

    • 频繁查询的列
    • 有外键关联的列
  • 不适合建立的列

    • 值变化少的列
    • 频繁更新的
    • 表的记录比较少:比如配置表

建表主键自动生成主键
show indexes from [table_name] 可以查看信息
在这里插入图片描述
这个哥们转的mysql博客贼多
https://blog.csdn.net/m0_37477061/article/details/86521100
https://blog.csdn.net/m0_37477061/category_7729066.html

你可能感兴趣的:(mysql,mysql)