基于docker构建mysql
- mysql5.7新特性:虚拟列(可以为存放的大文本json列创建一个虚拟列,作为该本文过滤用的索引)
- 官方镜像库地址:https://hub.docker.com/_/mysql
拉取镜像
docker pull mysql:5.7.32
启动容器,指定root用户登录密码
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32
进入容器并登录mysql
docker exec -it mysql mysql -uroot -p123456
效果等同于:
docker exec -it mysql /bin/bash
mysql -uroot -p123456
1.登录
mysql -uroot -p123456
查看用户库用户:
select user,host from mysql.user; #需要root登录mysql才能查
2.创建用户
localhost(本地用户):在mysql数据库登录
%(远程用户):可以远程使用Navicat for MySQL等客户端登录
create user 用户名@'%' identified by '密码';
3.创建数据库
create database 库名;
4. 给用户授予数据库权限
- 给用户授权某一个数据库的权限。库名.* 表示给用户授权这个数据库下的所有表权限。
grant all privileges on 库名.* to 用户名@'%';
- 创建一个新用户(给已存在的用户授权不用定义密码,同时创建时才需要密码,定义密码的用法在于授权时可以临时创建新的用户定义好密码并赋予它权限一步完成),并授权。
grant all privileges on 库名.* to 用户名@'%' identified by '密码';
- 也可以根据需要授予某些具体权限
grant select, update, insert, delete, create, drop, index, alter, grant, references, reload, shutdown, process, file on 库名.表名 to 用户名@'%';
5.administrative级的权限
grant reload, create user, process, replication client, replication slave, show databases, shutdown, super on *.* to 用户名@'%';
6.取消用户的某个权限,不会删除用户
revoke delete on 库名.* from 用户名@'%';
7.查看用户有哪些权限
show grants for 用户名@'%';
8.刷新系统权限表
flush privileges;
9.修改密码:(需要root登录mysql)
SET PASSWORD for 用户名=PASSWORD('密码');
mysqladmin -u用户名 -p密码
password:新密码
10.显示操作
show databases;
use 库名;
show tables;
describe/desc 表名; # 查看表结构
describe/desc 表名 字段名; #查看表中字段结构
create database 库名;
drop database 库名;
source lcdb.sql; #登录mysql数据库后,执行(登录mysql时所在的linux系统当前目录中)文件名为lcdb.sql的脚本
11.数据库(远程)备份
mysqldump -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #数据库备份成sql脚本,追加表名可详细到备份表
mysqldump -t -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #导出数据,追加表名可详细到备份表
mysqldump --opt -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #导出表结构,追加表名可详细到备份表
12.数据库表被锁,导致无法打开表,无法查看数据,不能对表执行操作(的解决办法):
1) 登录数据库
2) show processlist;
3) kill id; #找到数据库中的锁进程id,释放
13.数据库表已被删除,但远程数据库客户端还显示表名称,阻碍了对数据库表使用命令行进行批量备份
1) 进入到mysql数据库的安装目录(默认一般是/usr/local/mysql/)
2) 进入data目录(存储表结构和表数据的基础目录,需要root用户登录linux)
3) 有2种类型的表文件(.frm和.ibd),干掉垃圾表残余的文件
14.linux下的mysql默认是区分表名大小写,如何设置不区分:
1) root登录linux
2) vi /etc/my.cnf
3) 在mysqld节点之后添加:lower_case_table_names=1
15.对表的操作:
ALTER TABLE 't_users' DROP COLUMN 'username'; #删除表字段(有数据也可删除)
ALTER TABLE 't_users' ADD COLUMN 'password' VARCHAR(40) NULL DEFAULT NULL AFTER 'username'; #新增表字段
ALTER TABLE 't_users' MODIFY COLUMN 'password' VARCHAR(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL AFTER 'username'; #修改t_users表中password字段长度为40
DROP TABLE IF EXISTS t_users; #删除表
16.数据库报错:Lock wait timeout exceeded; try restarting transaction
报错原因:之前创建的数据库事务一直没有被提交或回滚,导致后面无法执行更新数据库的操作。
解决办法:
1)查看正在执行的事务:select * from information_schema.innodb_trx
2)找到了一个一直没有提交或回滚的事务(导致后面的事务无法继续执行),kill 线程ID(表字段为trx_mysql_thread_id)。
17.查看正在执行的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX
18.查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
19.查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
数据库锁:
表级锁的应用场景:数据迁移
20.数据库隔离级别:
数据库提供的四种隔离级别(mysql 默认Repeatable read):
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
解释:在一个事务中,第一次读会生成快照,再次读取时,会读取快照数据。多次读取的结果都是一样的,所以叫可重复读取。
③ Read committed (读已提交):可避免脏读的发生。
注:在这种事务的隔离级别下,还会存在不可重复读的问题,即在a事务开启后,查询到某条订单的状态是2,
此时又有个b事务,在b事务中对该条数据的状态改为1,并且b事务完成提交。此时在a事务中继续去查询此订单的状态还会是2。
如果数据库事务的隔离级别是 Repeatable read 可重复读,则在a事务中查询到的订单状态就应该是1了。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
查询数据库事务的隔离级别:
SELECT @@tx_isolation;
效果如下:
设置数据库的隔离级别:
set session transaction isolation level read uncommitted; #读未提交
set session transaction isolation level read committed; #读已提交
set session transaction isolation level repeatable read; #可重复读
set session transaction isolation level serializable; #串行化执行事务
21.mysql中的事务:
mysql中的事务是默认提交的,如果在 mysql 执行 update、delete 操作时想手动开启、提交事务想验证行级锁等操作时,可以用以下命令来开启和提交事务:
begin;
commit;
rollback;
22.两种存储引擎的MyISAM和InnoDB的比较:
参考:https://www.cnblogs.com/kevingrace/p/5685355.html
MyISAM 锁的粒度是表级;
InnoDB 支持行级锁定,但 InnoDB的行锁,只是在 WHERE 的主键(包括唯一非空索引、联合主键)是有效的,非主键的WHERE都会锁全表的。