mysql8安装(数据和配置放在/usr/local/docker/mysql/目录下)
1.先运行一个容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
2.从容器中复制出data(这个不要)
docker cp mysql:/var/lib/mysql/ /usr/local/docker/mysql/data/
3.同理复制出配置文件
docker cp mysql:/etc/mysql/my.cnf /usr/local/docker/mysql/conf/my.cnf
4.停止容器 删除容器
docker rm -f mysql
5.映射启动 mysql镜像 --privileged=true 是对容器赋予权限-v是将容器内部的文件映射到外部
docker run -d --restart unless-stopped --name mysql --privileged=true -p 3306:3306 -v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
编写docker-compose.yml
docker network create --subnet=172.10.0.0/24 kexianjun_network
version: '3'
services:
db:
image: mysql
container_name: mysql
restart: always
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: kexianjun
MYSQL_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
ports:
- '3360:3306'
volumes:
- "/usr/local/docker/mysql/data:/var/lib/mysql"
- "/usr/local/docker/mysql/conf/conf.d:/etc/mysql/conf.d"
#如果复制了docker中的my.cnf就就上下面这一句,如果没有复制则不能加,上面的可以直接使用
- /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
networks:
default:
ipv4_address: 172.10.0.5
networks:
default:
external:
name: kexianjun_network
最简单的docker-compose.yml
version: '3'
services:
mysql:
image: mysql
restart: always
container_name: mysql
privileged: true
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
- /usr/local/docker/mysql/data:/var/lib/mysql
mysql8版本order by查询报错问题解决
修改/usr/local/docker/mysql/conf/my.cnf
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
查询字符集
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
用户权限
查询所有用户
select user,host from mysql.user;
创建用户test设置密码:123456
create user 'test'@'%' identified by '123456';
插入上述是报错:1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决:
1.查看sql_mode,sql语句为:
select version(), @@sql_mode;
select @@GLOBAL.sql_mode;
查询出来的值为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2.去掉ONLY_FULL_GROUP_BY,重新设置值
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
set @@global.sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
在my.cnf 里面设置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
在sql_mode 中去掉only_full_group_by
授权数据库并刷新生效
grant all privileges on h**a.* to 'test'@'%';
flush privileges;
# 授权management库给test在任何地方登陆
grant all privileges on management.* to 'kexianjun'@'%'; #所有权限
grant select,insert,update,delete on management.* to 'text'@'%';#只能增删改查,不能删除表
接触test用户所有权限
revoke all privileges on *.* from 'test';
删除test用户
drop user 'test';
修改用户密码
alter user 'root'@'%' identified by '123456';
flush privileges;
alter user 'root'@'localhost' identified by '123456';
1.数据类型
数字:int decimal
字符串:char ,varchar,text
日期:datetime
布尔:bit
2.约束
主键 primary key
非空 not null
唯一 unique
默认 default
外键 foreign key
3.数据库连接数设置
show variables like '%max_connections%'; -- 显示数据库最大连接数量
set GLOBAL max_connections=400; -- 设置数据库最大连接数
二、基本操作
说明8.0版本
-- 修改原来的加密方式
ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
-- 修改密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新
FLUSH PRIVILEGES;
1.登录mysql数据库
mysql -u root -p #然后数据密码即可登录
quit #退出
2.建立数据库
create database 数据库名 charset=utf8; -- 建立数据库项目
3.删除数据库
drop database 数据库名;
4.切换/使用数据库
use 数据库名;
5.查看当前数据库
select database();
6.创建表
create table user( -- 建立一个名为user的表
id int primary key auto_increment,-- primary key 主键约束:
username varchar(20) unique, -- nuique 唯一约束
password varchar(20) not null,-- not null 非空约束
gender bit default 1,
age int,
birthday date
);
7.显示数据库
show databases ;
8.显示所有表
show tables ;
9.删除表
drop table user;
10.显示表结构
desc user;
11.显示建表语句
show create table 表名;
三、修改表
1.添加列
alter table 表名 add 列名 类型(长度) 约束;
2.修改列
alter table 表名 modify 列名 类型(长度) 约束; -- 修改列类型
3.删除列
alter table 表名 drop 列名;
4.修改列
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
5.修改表名
rename table 表名 to 新的表名;
6.设置表的字符集
alter table 表名 character set 字符集;
7.外键关联
alter table 表名 add constraint 约束名字 foreign key(外键字段) reference 表名(表中字段/主键);
四、添加数据
1.没有设置主键自增
insert into 表名(列名1,列名2) values(值1,值2);
insert into 表名 values(值1,值2);
2.主键自增型
insert into 表名 values(值2,值3);
五、修改数据
update 表名 set 列名1=值1,列名2=值2 [where 条件];
update 表名 set 列名1=值1,列名2=值2 where 列名3=值3;
六、删除数据
delete from 表名 [where 条件];-- 删除表中的数据,如果没有条件就是清空表中的所有数据
delete from user;-- 删除user表中的数据,回滚可恢复,属于dml语句
truncate table user;-- 删除user表中的数据,不可恢复,属于ddl语句
七、查询数据
1.不带条件的查所有
select * from user;
2.带条件查询
1.连接符and、or、not
select * from user where username='柯贤军' and age=28;
2.模糊查询like、_ 、in、between……and
select * from user where username like '张%/_';
#查询名字中有张的/和张一个字的
select username from user where username in('xxx','yyy');
3.判断空:is null、is not null
3.去除重复
select distinct * from user where age=28;
4.分组查询
select 列1,列1,聚合 from 表名 group by 列1,列2 having 列1="" and 列2 like '';
select * from 表名 where 列1="条件" order by 列名 asc/desc; #排序 asc是正序
select * from 表名 limit 1,5;# 查询第2也的5条信息
select distinct * from 表名 where 条件 group by 列名 having 条件 order by 列名 limit start,count
5.连接查询
select …… from 表1 inner join 表2 on 条件;
select ……from 表1 left join 表2 on 条件;
select …… from 表1 right join 表2 on 条件;
select distinct 列* from 表1 inner|left|right join 表2 on 表1和表2的关系 where 条件
group by 列名 having 条件 order by 列名* asc|desc limit start,count ;
6.子查询
7.视图
语法
create view 视图名 as (select *from 表名 join 表名2 on 条件)
alter view 视图名 as (sql语句)
8.索引
show index from 表名;#显示表的索引
create index 索引名 on 表名(字段(长度)); #创建索引
drop index [索引名称] on 表名;
reate index userid_index on hy_order_2018 (USERID);
9.性能检测
set profiling=1;#这里相当于开启性能检测
需要测试的sql都在这里写
show profiles;#显示性能检测结果
八、集群
replication集群方案:读写非强一致,不适合保存高价值数据
PXC集群方案:读写强一致性,适合高价值数据
mycat:同时管理两种集群方案