基于MYSQL

常见命令

# root密码登录
mysql -u root -p
# 指定ip地址密码登录
mysql -u root -h 192.168.1.1 -p
# 查询用户和主机(以root身份)
use mysql;
select user,host from user;

远程主机无法访问


一般情况:修改host,然后问题解决

Host XXX is not allowed to connect to this MySQL server

修改host

# 以root身份登录
use mysql;
# 查看host的状态
select host from user where user='root';
# 将Host设置为通配符%
update user set host = '%' where user ='root';
# 刷新权限即可
flush privileges;

特殊情况:修改host仍然未解决

1.3306端口冲突解决方法:

# 打开命令行,查看3306端口
netstat -ano | findstr "3306"
# 查看占用端口的程序
tasklist | findstr "9158"
# 发现有两个mysql进程都占据了3306端口;
# 可使用快捷键win+r,输入`services.msc`,在服务中关闭一个mysql或者直接使用命令杀掉一个进程(如杀掉9158进程)
taskkill /pid 9158
# 然后问题解决

忘记密码


windows环境

1.在mysql安装目录下,找到my.ini文件,打开文件,在[mysqld]后面任意行,加入skip-grant-tables;
2.重启MySQL:使用快捷键win+r打开运行,输入services.msc,回车打开服务,找到mysql服务,然后右击选择重启MySQL;
3.打开cmd命令行,输入mysql -u root -p,直接登录mysql;
4.修改root密码

use mysql;
# 旧的修改语句
update user set password=password("你的新密码") where user="root";
# 使用旧的修改语句如果报错:Unknown column ‘password’ in ‘field list’,则使用下面语句:
# 注:新版本的mysql对密码有要求,具体见附录
update mysql.user set authentication_string=password('root') where user='root' ;
# 刷新权限
flush privileges;

5.再次打开my.ini文件,删除skip-grant-tables,然后重启mysql服务。

linux环境

1.打开my.cnf文件,vi /etc/my.cnf,[mysqld]后面任意行,加入skip-grant-tables,用来跳过密码验证的过程;
2.使用/etc/init.d/mysql restart(或可能需要使用/etc/init.d/mysqld restart)重启mysql服务;
3.登录mysql,并修改密码,具体过程与windows环境一致;
4.修改完成后再打开my.cnf文件,删除skip-grant-tables,然后重启mysql服务。

添加用户并授权

# 以root用户登录mysql
mysql -u root -p
use mysql;
# 添加只能本地访问的新用户
create user 'user'@'localhost' identified by 'user!123456';
# 添加外网ip可以访问的新用户
create user 'user'@'%' identified by 'user!123456';
# 用户创建完成后需要授权
flush privileges;
# 基于业务的授权
grant all privileges on dbname.* to user@'%' identified by 'user!123456';
grant all privileges on dbname.* to user@'%' identified by 'user!123456' with grant option;
# 基于管理员的授权(两者差别见参考地址1)
grant all privileges on *.* to user@'%' identified by 'user!123456';
grant all privileges on *.* to user@'%' identified by 'user!123456' with grant option;
# 授权后,刷新权限
flush privileges;

参考地址:同样是MySQL的all privileges有啥不同?

使用工具可参考:》》》局域网数据库共享

数据库表大小写区分

mysql默认情况下是否区分大小写,使用

show Variables like '%table_names'
// 查看lower_case_table_names的值

0代表区分,1代表不区分。

设置不区分大小写(反之同理修改为0)

lower_case_table_names=1

创建函数出错

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

这是我们开启了bin-log, 我们就必须指定我们的函数是否是

  1. DETERMINISTIC 确定性的
  2. NO SQL 没有SQl语句,当然也不会修改数据
  3. READS SQL DATA 只是读取数据,当然也不会修改数据
  4. MODIFIES SQL DATA 要修改数据
  5. CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

在MySQL中创建函数时出现这种错误的解决方法:

set global log_bin_trust_function_creators=TRUE;

创建表出错-提示表空间已存在

ERROR 1813 (HY000): Tablespace ‘`库名`.`表名`‘ exists.

出现这个问题的大部分原因,在使用 InnoDB 引擎的数据库中,所有已经存在的表都使在使用 InnoDB 引擎的数据库中,所有已经存在的表都使用两个文件保存。假设表名为 test1,则在数据库的数据目录下会有两个文件:

  • test1.frm 文件,存储数据表的定义信息
  • test1.ibd 文件,存储数据表的内容

如果上述的 frm 文件某种原因丢失或者损坏,再去操作(比如删除这个表重新创建表"drop table if exists tbl_test;")可能就会报上面的错。

解决问题

适用于 MySQL 5.6 及以前的版本

先关闭 MySQL 的数据库服务,找到 MySQL 的安装目录下的 data 目录,找到报错的对应的库的目录进去,对应的表的 .ibd 文件直接删掉,重启服务即可。

data目录可以通过下面的SQL获取

show global variables like "%datadir%";


MySQL 5.7 版本的解决办法

MySQL 5.7 之后因为数据库会默认使用表空间隔离,所以上面的第二种办法就不好使了,因为这个时候怎么创建临时的库和相同名的表,它们的 .frm 和 .ibd 这两个文件并不能通用。第一种直接删除然而从新创建相同表还是会报错。那如何解决呢?

  1. 先关闭 MySQL 的数据库服务,删除掉报错的那个表的老的 .ibd 文件,比如 test1.ibd。
  2. 修改 my.ini 文件(Linux 系统自行对应 my.cnf),修改 innodb_file_per_table=0,如果没有在最后面添加即可,保存文件,重启数据库服务。
  3. 新建一个临时的库(库名随便取,比如 testdb),并创建一个同名的表,比如上面的假设表为 test1。这时候会在这个临时的库(testdb)的目录下出现这个表的 .frm 文件,比如 test1.frm。将这个文件拷贝到报错的数据库目录下覆盖粘贴即可。回到之前报错的库删除或重建这个表就不会报错了
  4. 最后不要忘了把修改的 innodb_file_per_table=0 换成 innodb_file_per_table=1 ,或者直接屏蔽或删除掉,保存重启数据库服务

data目录可以通过下面的SQL获取

show global variables like "%datadir%";

Last modification:January 7, 2023
如果觉得我的文章对你有用,您可以给博主买一杯果汁,谢谢!