登录
首先本机用wsl登录mysql的方式要指定安装目录下的mysql,否则找不到。
/mnt/c/Windows/system32$ mysql -u root -p urpassword
Command 'mysql' not found, but can be installed with:
sudo apt install mysql-client-core-8.0 # version 8.0.39-0ubuntu0.22.04.1, or
sudo apt install mariadb-client-core-10.6 # version 1:10.6.18-0ubuntu0.22.04.1
/mnt/c/Windows/system32$ /mnt/d/path/bin/mysql.exe -u root -p
问题
--可看可查不可解析读
head -n 10 /mnt/d/path/Data/mysql-bin.000001
权限之于当前WSL下的用户,可以查看binlog日志,但是没有mysqlbinlog的执行权限,不能解析了查看
$ /mnt/d/path/bin/mysqlbinlog.exe --start-position=230 --stop-position=499 --database=ods /mnt/d/path/Data/mysql-bin/mysql-bin.000002 /mnt/d/path/bin/mysql.exe -u root -p urpassword;
mysqlbinlog: [Warning] unknown variable 'loose-default-character-set=utf8mb4'
Enter password: **********
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File '/mnt/d/path/Data/mysql-bin/mysql-bin.000002' not found (OS errno 2 - No such file or directory)
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
其实账号对日志文件显示所有权限
/mnt/d/path/Data/mysql-bin$ ll
total 4
drwxrwxrwx 1 user123 user123 4096 Feb 21 17:21 ./
drwxrwxrwx 1 user123 user123 4096 Feb 21 10:16 ../
-rwxrwxrwx 1 user123 user123 1074 Feb 21 16:54 mysql-bin.000001*
-rwxrwxrwx 1 user123 user123 0 Feb 21 17:21 mysql-bin.000002*
因为在git bash中查看权限是不可执行的,windows怎么修改都没用,授权,修改owner,所有权限都给这个用户user123 皆无效
username @DESKTOP-aaabbb MINGW32 /d/software/mysql-8.0.11-winx64/Data
$ chmod 777 mysql-bin.000001
username @DESKTOP-aaabbb MINGW32 /d/software/mysql-8.0.11-winx64/Data
$ ll
total 182902-rw-r--r-- 1 username 197121 56 11月 4 15:06 auto.cnf
-rw-r--r-- 1 username 197121 508350 10月 30 15:47 binlog.000009
-rw-r--r-- 1 username 197121 155 10月 30 15:58 binlog.000010
-rw-r--r-- 1 username 197121 155 10月 30 15:58 binlog.000011
解决方案
复制这个日志到WSL用户下面的文件夹里,这样就拥有所有权限了
cp /mnt/d/path/Data/mysql-bin/mysql-bin.000001 ./
解析后的sql可以放到一个文件中方便读取
/mnt/d/path/bin/mysqlbinlog.exe --start-position=230 --stop-position=499 --database=ods --base64-output=DECODE-ROWS --verbose /home/user123/mysql-bin.000001 > /mnt/d/path/Data/mysql-bin/test1.sql
查看当前文件夹地址
wslUserName@DESKTOP-aaabbb:~$ pwd
/home/wslUserName
数据恢复
/mnt/d/path/bin/mysqlbinlog.exe --start-position=230 --stop-position=620 --database=ods --verbose /home/wslUserName/mysql-bin.000007 | /mnt/d/path/bin/mysql.exe -uroot -purpassword -v ods
注意
用户名和密码紧贴着-u和-p写,不要有空格
不要加--base64-output=DECODE-ROWS
--base64-output=decode-rows
主要是解析 ROW 级别 binlog 日志时使用。
我们解析日志的时候都会使用:
# mysqlbinlog -v --base64-output=decode-rows --start-position=XXX --stop-position=XXX mysql-bin.0000XX
/mnt/d/path/bin/mysqlbinlog.exe -v --base64-output=decode-rows --start-position=230 --stop-position=499 /home/wslUserName/mysql-bin.000001
这是我们解析 binlog 日志时使用的命令,我们可以很直观的分析 binlog 日志。
但是我们想要恢复到数据库中的时候,不能使用--base64-output=decode-rows
参数,否则是无法恢复到数据库的。
如果查看日志的时候显示乱码可能是显示页面的编码格式问题可以修复一下,两种方式自行挑选。
--显示乱码的安装和切换
wslUserName@DESKTOP-aaabbb:~$ chcp 65001
Command 'chcp' not found, but can be installed with:
sudo apt install nilfs-tools
wslUserName@DESKTOP-aaabbb:~$ sudo apt install nilfs-tools
[sudo] password for wslUserName:
wslUserName@DESKTOP-aaabbb:~$ echo "chcp 65001" >> ~/.bash_profile
wslUserName@DESKTOP-aaabbb:~$ export LANG=en_US.UTF-8
遗留讨论
通过delete 方式记录的每一行数据,使用mysqlbinlog工具恢复仍然是删除操作!
如果是误操作,需要转换成insert语句才可以恢复之前的数据!
update不影响,可以恢复到update之前的数据,但是要注意恢复的位置节点或者时间,不要等到又更新回去了!