赞
踩
docker pull mysql:5.7.32
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32
- docker exec -it mysql mysql -uroot -p123456
-
- 效果等同于:
- docker exec -it mysql /bin/bash
- mysql -uroot -p123456
mysql -uroot -p123456
查看用户库用户:
select user,host from mysql.user; #需要root登录mysql才能查
localhost(本地用户):在mysql数据库登录
%(远程用户):可以远程使用Navicat for MySQL等客户端登录
create user 用户名@'%' identified by '密码';
create database 库名;
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 用户名@'%';
grant reload, create user, process, replication client, replication slave, show databases, shutdown, super on *.* to 用户名@'%';
revoke delete on 库名.* from 用户名@'%';
show grants for 用户名@'%';
flush privileges;
SET PASSWORD for 用户名=PASSWORD('密码');
mysqladmin -u用户名 -p密码
password:新密码
show databases;
use 库名;
show tables;
describe/desc 表名; # 查看表结构
describe/desc 表名 字段名; #查看表中字段结构
create database 库名;
drop database 库名;
source lcdb.sql; #登录mysql数据库后,执行(登录mysql时所在的linux系统当前目录中)文件名为lcdb.sql的脚本
mysqldump -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #数据库备份成sql脚本,追加表名可详细到备份表
mysqldump -t -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #导出数据,追加表名可详细到备份表
mysqldump --opt -h'数据库ip' -u'用户名' -p'密码' 库名 表名 > lcdb.sql; #导出表结构,追加表名可详细到备份表
1) 登录数据库
2) show processlist;
3) kill id; #找到数据库中的锁进程id,释放
1) 进入到mysql数据库的安装目录(默认一般是/usr/local/mysql/)
2) 进入data目录(存储表结构和表数据的基础目录,需要root用户登录linux)
3) 有2种类型的表文件(.frm和.ibd),干掉垃圾表残余的文件
1) root登录linux
2) vi /etc/my.cnf
3) 在mysqld节点之后添加:lower_case_table_names=1
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; #删除表
报错原因:之前创建的数据库事务一直没有被提交或回滚,导致后面无法执行更新数据库的操作。
解决办法:
1)查看正在执行的事务:select * from information_schema.innodb_trx
2)找到了一个一直没有提交或回滚的事务(导致后面的事务无法继续执行),kill 线程ID(表字段为trx_mysql_thread_id)。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
表级锁的应用场景:数据迁移
数据库提供的四种隔离级别(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; #串行化执行事务
mysql中的事务是默认提交的,如果在 mysql 执行 update、delete 操作时想手动开启、提交事务想验证行级锁等操作时,可以用以下命令来开启和提交事务:
begin;
commit;
rollback;
参考:https://www.cnblogs.com/kevingrace/p/5685355.html
MyISAM 锁的粒度是表级;
InnoDB 支持行级锁定,但 InnoDB的行锁,只是在 WHERE 的主键(包括唯一非空索引、联合主键)是有效的,非主键的WHERE都会锁全表的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。