安装部署
新建用户很重要
groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M mysql
echo mysql:mysql|chpasswd
创建相关目录
mkdir -p /data
mkdir -p /log/binlog
mkdir -p /log/relaylog/realy
mkdir -p /mysqltmp
chown -R mysql.mysql /data
chown -R mysql.mysql /log
chown -R mysql.mysql /mysqltmp
chmod 750 /data
chmod 750 /log
chmod 750 /mysqltmp
在/opt下解压
tar xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz -C /opt/
ln -s mysql-8.0.20-linux-glibc2.12-x86_64 mysql
chown -R mysql.mysql mysql
创建服务
cat > /etc/systemd/system/mysqld.service << EOF
[Unit]
Description=MYSQL Server
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 10000
EOF

编辑/etc/my.cnf

[client]				#服务器16G内存配置注释
port = 3306
socket = /data/mysql.sock
[mysqld]
port = 3306
basedir = /opt/mysql
datadir=/data
pid-file=/data/3306.pid
log_bin=/log/binlog/mysql3306bin
max_binlog_size=512M #1024M
character-set-server = utf8mb4
socket=/data/mysql.sock
max_connections = 500 #800
log_error=/data/error.log
slow_query_log = 1
relay_log = /log/relaylog/relay
slow_query_log_file=/data/slow.log
key_buffer_size = 16M #64M
max_allowed_packet = 1M #32m
table_open_cache = 64 #3000
sort_buffer_size = 512K #20M
read_buffer_size = 256K #64m
read_rnd_buffer_size = 512K #64M
server-id = 1 #注意
socket = /data/mysql.sock
innodb_buffer_pool_size = 16M #60000M
innodb_log_file_size = 5M #2G
innodb_log_buffer_size = 8M #16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50 #20
[mysqldump]
quick
max_allowed_packet = 16M #32m
socket=/data/mysql.sock
[mysql]
no-auto-rehash
--------------------------------------------
#注意
chown -R mysql.mysql /etc/my.cnf #注意
chown -R mysql.mysql /data
初始化root执行
cd /opt/mysql/bin
./mysqld --defaults-file=/etc/my.cnf --initialize_insecure --user=mysql
#/data.error.log查看日志报错
启停mysqld
systemctl daemon-reload
systemctl start mysqld
systemctl restart mysqld
配置环境变量
# vim /etc/profile
export MYSQL_HOME=/opt/mysql
export PATH=$PATH:$JAVA_HOME/bin:$MYSQL_HOME/bin
--------------------------------------------------------------
source /etc/profile
设置密码和权限
mysql -uroot -p -S /data/mysql.sock -e "SET PASSWORD ='mysql';create user 'root'@'%' identified by 'mysql'; GRANT ALL PRIVILEGES on *.* to 'root'@'%' WITH GRANT OPTION;"
#按回车,现在还是空密码

最新Navicat 15 for MySQL破解+教程 正确破解步骤_Mysql_脚本之家 (jb51.net)

mysql备份
mysqldump -u username -ppassword --all-databases  > backupname.sql	#mysqldump命令备份所有数据库
mysqldump -u [用户名] -p [密码] [库名] >[备份文件名].sql #mysqldump备份单个库
mysqldump -u username -p dbname table >table.sql #备份单个表
mysqldump -u username -p dbname table1 table2 >tables.sql #备份多个表
mysqldump -u username -p -d db_name > db_name.sql #导出一个库中的所有表结构
mysqldump -u username -p -d db_name table1 table2 > tables.sql # 导出一个库中的一张或多张表的表结构)
mysqldump -u username -p db_name table --no-create-info >tables.sql #只导出这张表的数据,表结构不要
mysqldump -u username -p -d --all-databases > all_db.sql # 导出所有的数据库表结构
set foreign_key_checks= 0 #数据导入报错提示主键问题先设置在导入,导入完再设置1

xtrabackup安装备份版本8,mysql版本也需要8不然会报错
#主库操作
mkdir -p /backup/mysqlbackup/xtrback
cd /backup #将包传入backup
tar xzvf percona-xtrabackup-8.0.22-15-Linux-x86_64.glibc2.12.tar.gz
ln -s percona-xtrabackup-8.0.22-15-Linux-x86_64.glibc2.12 percona-xtrabackup-8.0.22
#从库操作
mkdir -p /backup/xbakdata
cd /backup #将包传入backup
tar xzvf percona-xtrabackup-8.0.22-15-Linux-x86_64.glibc2.12.tar.gz
ln -s percona-xtrabackup-8.0.22-15-Linux-x86_64.glibc2.12 percona-xtrabackup-8.0.22
#主库备份
cd /backup/percona-xtrabackup-8.0.22/bin
./xtrabackup --defaults-file=/etc/my.cnf --backup -uroot -pmysql --target-dir=/backup/mysqlbackup/xtrback
#将主库的备份目录打包
cd /backup/mysqlbackup/xtrback
tar czvf xtrabackupdata.tar.gz /backup/mysqlbackup/xtrback/*
#主库的备份文件传输到从库
scp -r xtrabackupdata.tar.gz root@192.168.236.165:/backup/mysqlbackup/xtrback/
#从库解压
cd /backup/mysqlbackup/xtrback
tar xzvf xtrabackupdata.tar.gz
rm -rf xtrabackupdata.tar.gz
#从库停止进程
systemctl stop mysqld
#把从库的目录清空
rm -rf /data/*
rm -rf /log/binlog/*
rm -rf /log/relaylog/*
#从库将备份文件拷贝到对象的data目录
cd /backup/percona-xtrabackup-8.0.22/bin
./xtrabackup --defaults-flie=/etc/my.cnf --copy-back --target-dir=/backup/xbakdata/backup/mysqlbackup/xtrback #一定要指定主库解压目录的位置
#从库删除auto.conf
rm -rf /data/auto.conf
#从库赋予权限
chown -R mysql.mysql /data
chown -R mysql.mysql /log/binlog
chown -R mysql.mysql /log/relaylog
#从库将slave_preserve_commit_order=ON改为ON,若没有配置则添加
#从库在次启动 有错误在/data/error.log看
systemctl start mysqld
mysql主从
#在xtrabackup同步后
#查看主库的gdit的位置
stop slave;
reset master;
set @@global.gdit_purged='id值'
change master to master_host='192.168.236.164',master_user='root',master_password='mysql',master_auto_position=1;
start slave;
show slave status\G;
#2YESok
------------------------------------------------------------------------------------------------------------
#假如没有配置gdit不需要
#主库查看show master status; #mysql3306bin.000008 | 156
stop slave;
reset master;
CHANGE MASTER TO master_host='192.168.236.164',master_user='root',master_password='mysql',master_log_file='mysql3306bin.000008',master_log_pos=156;
start slave;
show slave status\G;
#2YESok
常量查询
SELECT VERSION( )  		#服务器版本信息
SELECT DATABASE( ) #当前数据库名 (或者返回空)
SELECT USER( ) #当前用户名
SHOW STATUS #服务器状态
SHOW VARIABLES #服务器配置变量
show engines; #查看版本支持的存储引擎
创建表结构
主键约束
#用来唯一标识数据库中的每一条记录通常不用业务字段作为主键主键是给数据库和程序使用的,不是给终端客户使用的只要不重复,非空就行
#主键特点:非空,唯一
#案例
create table douban(id int primary key auto_increment,title varchar(20),pingfen varchar(20),xinde varchar(100)); #主键加上自增
#带有主键约束的表插入的时候需要列出所有字段
INSERT into douban(title,pingfen,xinde) values('haha','xixi','wawa');
#清表自增1开始
truncate table douban
唯一约束
#表中的某一列不能重复出现name varchar(20) unique	如果字段添加unique,这个字段不能重复,null可以
create table douban(id int primary key auto_increment,title varchar(20) unique ,pingfen varchar(20),xinde varchar(100));
非空约束
#某一列不能为空 age int not null
create table douban(id int primary key auto_increment,title varchar(20) unique ,pingfen varchar(20),xinde varchar(100) not null);
外键约束写在代码里
数据库的字段属性
UnSigned			#无符号的声明了该列不能为负数
ZEROFILL #0填充,不足位数的用0来填充 , 如int(3),5则为005
NOT NULL #则该列必须有值
DEFAULT #用于设置默认值,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
Auto_InCrement #通常理解为自增,自动在上一条记录的基础上默认+1通常用来设计唯一的主键,必须是整数类型
COMMENT #描述
#可定义起始值和步长当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
创建表案例
CREATE TABLE IF NOT EXISTS `student`(								  
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
SQL语句
DDL
#DDL(数据定义语言):create drop alter,对表结构的增删改
# 查询所有数据库
SHOW DATABASES;
# 查看当前数据库
SELECT DATABASE();
# 创建数据库 方括号内是可选参数
# 标准语法 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] ;
create database itcast;
# 删除数据库 drop database [ if exists ] 数据库名 ; if exists 代表数据库存在在删除
DROP DATABASE IF EXISTS teste;
# 切换数据库 use 数据库名
use test
#对表定义操作
# 查询当前数据库所有表
show tables;
# 查询表结构 desc 表名
desc student;
# 查看创建表语句 SHOW CREATE TABLE 表名
SHOW CREATE TABLE student;
# 修改字段添加列 ALTER TABLE 表名 ADD 字段名 类型 (长度) [ COMMENT 注释 ] [ 约束 ];
ALTER TABLE student ADD age varchar(20) COMMENT '昵称';
# 修改数据库字段类型
#ALTER TABLE emp MODIFY 字段名 新数据类型 (长度)
ALTER TABLE student MODIFY name varchar(10); # MODIFY COLUMN 一样
# 修改数据类型和字段名称
#ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新类型 (长度) [ COMMENT 注释 ] [ 约束 ];
ALTER TABLE student CHANGE name names char(20) COMMENT "哇" NOT NULL;
# 删除字段
#ALTER TABLE 表名 drop 字段名称
ALTER TABLE student drop names;
#修改表名
RENAME TABLE old_table_name TO new_table_name;
#删除表
DROP TABLE 表名 或 TRUNCATE TABLE 表名;
DROP TABLE students; #TRUNCATE TABLE student;
DML (数据操作语言):insert delete update,对表中的数据进行增删改
#插入insert普通用法
INSERT INTO `student`(`name`) VALUES ('zsr');
#插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女');
#省略字段 #有主键自增也必须添加,必须所有字段都要添加进去
INSERT INTO `student` VALUES (5,'Bareth','123456','男','武汉','1412@qq.com','2000-02-04','2000-02-04');
----------------------------------------------------------------------------------------------------
#修改update
UPDATE 表名 SET 字段1=值1,[字段2=值2...] WHERE 条件[];
#修改学员名字,指定条件
UPDATE `student` SET `name`='zsr204' WHERE id=1; #条件是id=1
#不指定条件的情况,会改动所有表 #不能那么搞要死人的
UPDATE `student` SET `name`='zsr204';
#修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1; #条件是id=1
#通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024'; #条件是name=zsr并且`pwd`='200024'
-----------------------------------------------------------------------------------------------------------
#删除delete
#DELETE FROM 表名 [WHERE 条件]
DELETE FROM `student`; #不能那么搞要死人的
#删除指定数据
DELETE FROM `student` WHERE id=1;
#DELETE和TRUNCATE 的区别,TRUNCATE 重新设置自增列,计数器会归零,而DELETE不会影响自增
#DELETE操作时原数据会被放到 rollback segment中,可以被回滚
#TRUNCATE操作时不会进行存储,不能进行回滚
测试
START TRANSACTION; #开启事务
DELETE FROM student; #删表 TRUNCATE就嗝屁了
SELECT * FROM student; #空了
ROLLBACK; #数据又有了

v2-c367a355755f3c78ba53baf7b9caf739_1440w

DQL
#DQL(数据查询语言):查询语句,凡是select语句都是DQL
#SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数
SELECT * FROM student; #查询所有
SELECT `name`,`sex` FROM student; #查询指定的字段
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS 学生表;#别名 AS(可以给字段起别名,也可以给表起别名)
SELECT DISTINCT `sex` FROM student; #去重查询
#where条件查询
select 查询列表 from 表名 where 筛选条件;

DCL
#DCL(数据控制语言):grant授权、revoke撤销权限
GRANT ALL PRIVILEGES on *.* TO zsr2 #用户授权(授予全部权限,除了给其他用户授权)
SHOW GRANTS FOR root@localhost #查看root用户权限
REVOKE ALL PRIVILEGES ON *.* FROM zsr # 撤销权限
常用函数
#数学运算
SELECT ABS(-8); -- 绝对值
SELECT CEIL(5.1); -- 向上取整
SELECT CEILING(5.1); -- 向上取整
SELECT RAND(); -- 返回0~1之间的一个随机数
SELECT SIGN(-10); -- 返回一个数的符号;0返回0;正数返回1;负数返回-1
#字符串函数
SELECT CHAR_LENGTH('我喜欢你'); -- 字符串长度
SELECT CONCAT('我','喜欢','你'); -- 拼接字符串
SELECT INSERT('我喜欢',1,1,'超级') -- INSERT(str,pos,len,newstr) 从str的pos位置开始替换为长度为len的newstr
SELECT UPPER('zsr'); -- 转大写
SELECT LOWER('ZSR'); -- 转小写
SELECT INSTR('zsrs','s'); -- 返回第一次出现字串索引的位置
SELECT REPLACE('加油就能胜利','加油','坚持'); -- 替换出现的指定字符串
SELECT SUBSTR('坚持就是胜利',3,6); -- 返回指定的字符串(源字符串,截取位置,截取长度)
SELECT REVERSE('rsz'); -- 反转字符串
#时间日期函数
SELECT CURRENT_DATE(); -- 获取当前日期
SELECT CURDATE(); -- 获取当前日期
SELECT now(); -- 获取当前时间
SELECT LOCALTIME(); -- 本地时间
SELECT SYSDATE(); -- 系统时间
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
#系统信息
SELECT SYSTEM_USER();
SELECT USER();
SELECT VERSION();
聚合函数

v2-c367a355755f3c78ba53baf7b9caf739_1440w

TCL事务(事务控制语言):commit提交事务,rollback回滚事务。(T:transaction)
SET autocommit=0;			#关闭自动提交
START TRANSACTION; #开启事务
COMMIT #成功提交
ROLLBACK; #失败回滚
SET autocommit=0; #开启自动提交
索引 不是越多越好,小数据量的表不需要加索引
主键索引primary key#最常见的索引类型,不允许为空值#确保数据记录的唯一性,确定特定数据记录在数据库中的位置
普通索引(KEY / INDEX) #默认的,快速定位特定数据,index 和 key 关键字都可以设置常规索引,应加在查询找条件的字段
#直接创建普通索引
CREATE INDEX indexName ON tableName (columnName)
CREATE INDEX xixi ON student (name); #KEY `xixi` (`name`)
#创建表的时候指定普通索引
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
KEY xixi (`name`),
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
#创建完毕后,增加索引
-- 方法一:CREATE在已存在的表上创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
-- 方法二:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL]
INDEX 索引名 (字段名[(长度)] [ASC |DESC]) ;
#索引的删除
-- 删除索引
DROP INDEX 索引名 ON 表名;
-- 删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;
#显示索引信息
SHOW INDEX FROM 表名;
#增加索引后测试
EXPLAIN SELECT * FROM student where name='zsr';
show processlist    					#查看mysql线程状态