MySQL常见问题怎么解决?

491 阅读2分钟

如何修改密码及授权

# 启动mysql
> systemctl start mysqld.service

# 获取随机密码
> grep "password" /var/log/mysqld.log

# 登录mysql数据库,输入密码
> mysql -u root -p

# 设置密码策略
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;

# 修改密码
mysql> alter user 'root'@'localhost' IDENTIFIED BY 'password';

# 授权
# 第一个*表示数据库名;第二个*表示该数据库的表名,*.*表示所有到数据库下到所有表都允许访问;
# %表示允许访问到mysql的ip地址,%表示所有ip均可以访问;
mysql> grant all privileges on *.* to root@'%' identified by 'password';

# 刷新权限
mysql> flush privileges;

# 忘记密码
> vi /etc/my.cnf

# 添加(密码重置后,删除该行)
skip-grant-tables

# 重启
> systemctl restart mysqld.service

# 登录mysql数据库,输入密码
> mysql -uroot -p

# 修改密码
mysql> use mysql;
mysql> update user set authentication_string = password("password") where user="root";
mysql> flush privileges;

字符串比较时发生错误问题

# 针对字符串比较时发生错误
java.sql.SQLException: Illegal mix of collations (utf8_esperanto_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '=';

# 查看表之间的编码是否一致;
show create table <表名>;

# 如果表不一致,修改其中一个表的编码格式,使其表间编码一致
alter table <表名> character set utf8 COLLATE utf8_general_ci;

# 表间编码一致仍出现同样错误,查询(相关查询语句的,=号两边)字段之间是否一致
show full columns from <表名>;
select charset(<字段名>) from<表名>;

# 修改字段编码
alter table <表名> modify <字段名> <字段类型> character set utf8 collate utf8_general_ci;

使用多个join(select)表连接合并,执行速度缓慢问题

# 针对5.7新特性(derived_merge),取消优化器derived_merge参数
show global variables like '%switch%';
set session optimizer_switch = 'derived_merge=off';
set global optimizer_switch = 'derived_merge=off';

进程等待、死锁问题

-- 查询正在运行的线程(并发连接数)
show processlist;

-- 查询正在运行的事务
select * from information_schema.innodb_trx order by trx_started asc;

-- 查询表使用次数及锁表情况
show open tables where in_use > 0;

-- 杀死指定进程
kill id;

删除大量数据操作耗时较长问题

-- 创建备份表
create table '备份表名' select * from '表名' where 1 != 1;

-- 抽取需要保留的数据
insert into '备份表名' select * from '表名' where time > '日期';

-- 清空表数据,释放表空间
truncate table '表名' drop storage;

-- 禁用外键约束
set foreign_key_checks = 0;

-- 插入数据
insert into '表名' select * from '备份表名';

数据删除后,长度空间不变问题

-- 执行 `delete` 时,并不会真正的把数据删掉,而是将数据转换成碎片,查看表中的碎片数量和索引等信息
show table status like 'table_name'

-- 删除碎片
optimize table table_name