September 15, 2023
查找并杀掉运行中事务
#
-- 获取线程id然后杀掉
SELECT * FROM information_schema.innodb_trx;
-- 优先找到其中耗时最长的删
kill 36272;
kill 36275;
kill 35971;
kill 35972;
-- 其它
select * from performance_schema.events_statements_current;
show processlist;
查看锁使用情况
#
SELECT object_name, index_name, lock_type, lock_mode, lock_data FROM performance_schema.data_locks;
Windows环境下死锁时重启数据库导致数据库出现“启动后停止”
#
后面重启服务器也不行,一直提示:
> net start mysql
MYSQL服务正在启动
MYSQL服务无法启动
服务没有报告任何错误。
请键入 MET HELPMSG 3534 以获得更多的帮助。
解决办法:
将data目录移走,再重新初始化数据库,此时可正常启动数据库;然后停止数据库,将旧data数据库里的数据库和索引文件复制回新的data目录里,再启动数据库。
# 重新初始化数据库
mysqld --initialize-insecure --user=mysql
mysqld -install
# 停止和启动
net stop mysql
net start mysql
参考
其中需要复制的文件有这些:
[数据库目录]
#ib_16384_0.dblwr # Doublewrite Buffer (内存+磁盘), 新的DBLWR以及它如何帮助解决历史上MySQL性能问题
#ib_16384_1.dblwr
auto.cnf # 记录mysql数据库实例的server_uuid,安装的时候初始化,master和slave的server_uuid不能一样
ib_fubber_pool # 缓存池,存放部分最近的查询记录和索引等,可以通过show variables like 'innodb%pool%'查
ibdata1 # innodb表空间,如果采用innodb引擎,会默认10M大小
mysql.ibd # innodb存储引擎的数据文件
双写
#
official
...June 1, 2023
wsl2版本
#
> wsl.exe -v
WSL version: 1.2.5.0
Kernel version: 5.15.90.1
WSLg version: 1.0.51
MSRDC version: 1.2.3770
Direct3D version: 1.608.2-61064218
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.19045.3031
使用过程中,因为磁盘空间问题,把子系统安装位置从C盘
转移到了其它盘。
操作
#
把sql
目录里的*.sql
文件逐一导入到8.0.33
版本的Mysql
。
尽管sql
文件不多也不大,但是整个过程非常慢。其中一个有一千个左右的INSERT IGNORE
语句,更是用了将近12分钟才完成。
怎么办?
#
改为通过网络访问本机的数据库。
端口
#
一文中提到:
根据我的观察, 如果Windows本地启动了指定端口, 这时WSL2中虽然可以使用相同的端口, 但是localhost:port 将指向Windows的服务, WSL的服务将会被覆盖!
当然了, 如果我们配置了端口转发, 转发的IP是WSL的地址, 而不是localhost, 那么WSL将会覆盖Windows的服务!
而我的观察是,
我发现本地起了数据库服务之后,在wsl2里起数据库服务(mysql服务,端口都是3306)的情况下,是不会报端口重复绑定错误的。
但是如果我在wsl2里先起一个服务,绑定端口14222后,再在主机起相同服务,想绑定相同端口时,则会报错端口已被绑定。
如果我是先在主机起上述服务,然后再在wsl2起该服务,则能正常启动。那在主机访问localhost:[port]
时会访问到哪个呢?此时访问到的是主机的服务。
所以端口是否占用会不会还跟服务起的顺序有关呢?
暂时未看到有确切的描述。
但是,经过上面的实验,可以认为:
先在主机起服务,再在wsl2起服务绑定相同端口时,服务可正常启动;在主机访问`localhost:[port]`时访问的是主机的服务;在wsl2里访问的则是wsl2的服务,除非手动指定主机IP。
而如果先在wsl2里起了服务,再在主机起服务(绑定相同端口: 14222),则会报错端口已被绑定。
但是,如果在wsl2里先起的mysql服务,再在主机起,则不会报错,所以还跟端口值有关?
最新发现
#
如何通过局域网访问WSL2中的服务?
假设局域网上有两台主机A和B。主机A安装了WSL2、开启了Redis服务,端口为6379。现在主机B如何才能访问主机A上WSL2的Redis服务呢?
- 配置端口转发
1). 以管理员权限打开PS,输入命令:
...May 16, 2023
What
#
mysqlrouter
是一个代理,可以将查询转发到配置好的数据库服务里。
Why
#
在办公室网络环境下基于win10 wsl2
开发应用时,需要连接到主机所在局域网的其它机器上的数据库服务。
也就是说,存在机器:wsl2、主机、其它机器。
wsl2
通过NAT
网络模式与主机
互通,并且wsl2
可以访问外网。
但是wsl2
不能访问到其它机器
上的数据库服务,不知道是不是办公室网络环境存在限制。
为了使得wsl2
能访问到其它机器
上的数据库服务成立,在主机
启动mysqlrouter
充当代理,然后wsl2
通过访问代理来访问其它机器
。
Install
#
可以使用mysql installer
选择安装。
简单模式
#
配置文件(mysqlrouter.conf):
[DEFAULT]
logging_folder = D:/Data/mysqlrouter/log
plugin_folder = C:/Program Files/MySQL/MySQL Router 8.0/lib # 这里是插件所在目录,必须是mysqlrouter安装路径下的目录,否则报错找不到插件
config_folder = D:/Data/mysqlrouter/etc # 启动配置默认查找目录,会在目录里寻找mysqlrouter.conf文件
runtime_folder = D:/Data/mysqlrouter/run
data_folder = D:/Data/mysqlrouter/data
[logger]
level = DEBUG
[routing:primary]
bind_address=172.20.96.1 # 主机ip地址
bind_port=6446 # 主机监听端口
destinations = 172.17.39.239:3306 # 目标机器,也就是实际执行查询的数据库服务所在机器的地址
mode = read-write
connect_timeout = 10
启动:mysqlrouter -c D:\Data\mysqlrouter\etc\mysqlrouter.conf
...