[TOC]
容灾备份介绍
1.容灾备份恢复必备条件
MySQL 数据库开启了log-bin参数记录binlog日志功能,且主库于备份的从库都要开启binlo功能。
1.全量备份
全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份。
案例:
[TOC]
1.容灾备份恢复必备条件
MySQL 数据库开启了log-bin参数记录binlog日志功能,且主库于备份的从库都要开启binlo功能。
1.全量备份
全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份。
案例:
[TOC]
1.容灾备份恢复必备条件
MySQL 数据库开启了log-bin参数记录binlog日志功能,且主库于备份的从库都要开启binlo功能。
1.全量备份
全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份。
案例:1
2
3
4
5#备份所有库 -F 刷新BINLOG
mysql -uroot -p12345 -S mysql.sock --defalut-character-set=utf8 --single--transaction -F -A | gzip > /backup/mysql.bak.sql.gz
#备份一个库
mysql -uroot -p12345 -S mysql.sock -F -B student | gzip > /backup/mysql.bak.sql.gz
注意:因为-single-transaction选项备份时涉及到的是select语句,所以dml语句是被允许的,ddl不被允许直到回滚保存点撤销select 语句
2.1 按天全备情况
2.2 按周全备情况
1 | 1) 中小公司:全量每天一次在业务流量低谷执行全备,执行前要进行锁表。 |
Q:mysqldump 备份什么时候派上用场?
A:
Q:什么情况下需要增量恢复?
A:常用于一主多从的数据库架构下,从库上开启binlog然后实施定时全备份和实时增量备份。
Q:什么是增量恢复?
利用二进制日志和全备进行的恢复过程,称为增量恢复。
Q: 人为操作数据库SQL语句破坏主库是否需要增量恢复?
A:在主库内部命令行误操作,会导致所有的数据库(包括主从库)数据丢失,这样的场景是需要增量恢复的。
Q:只有一个主库是否需要增量恢复?
A:如果公司里只有一个主库情况下,尽量做全备(一天一次),及增量备份(每隔1-10分钟对bin-log日志做的切割返回备份到其他服务器上,或者本地),宁一种好的方法就是做从库,基于drod(基于磁盘块的)同步。
小结:
测试环境:Ubuntu 16TLS
迁移流程:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#1.在目录迁徙目标文件夹(原始数据),默认目录:/var/lib/mysql ,注意权限700与所属者,所属组都是mysql用户与组.
drwx------ mysql mysql mysql/
#2.建立备份目录
sudo mkdir /databackup
sudo chown -vR mysql:mysql /databackup/
sudo chmod -vR 700 /databackup/
#3.通过cp命令进行复制(由于权限问题需要切换到root权限):
$ su root
$ cp -av /var/lib/mysql/* /databackup/
$ exit
#4.下面需要修改MySQL配置文件:
vim /etc/mysql/my.cnf #12.06 verion
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 16.04 version
#5.修改配置文件,设置新的datadir = /databackup,并用#注销默认数据目录。
#6.修改appormor 配置(Ubuntu里面的软件都受到这个的限制),修改为:/mysqldata/ r, /mysqldata/** rwk,
$sudo vim /etc/apparmor.d/user.sbin.mysqld
#7.重启apparmor | MySQL
$sudo service apparmor reload
$sudo service mysql start
#8.登陆MySQL ( 默认情况下,出于安全的考虑,MySQL在初始状态下不允许远程连接,只允许服务器内部应用的本地连接。 )
mysql -uroot -p
#9.创建数据库,查看迁移目录下的数据库文件 并删除原数据库文件
> create database imooc;
$ su root
$ cd /mysqldata
$ rm -rvf /usr/lib/mysql
描述:利用mysqldump备份数据库过程,实际上就是把数据从mysql库里以逻辑的SQL语句的形式直接输出或者生成备份的文件的过程;
1 | #语法: |
1 | #实战 |
1 | # 差备恢复 |
1 | #实例 |
1 | /*语法:*/ |
1 | #--master-data = 1 |
描述:有时需要恢复到一个操作之前的数据库,但又不想丢失这一部分的数据,那么可以用初步增量进行将这段时间参数的数据,恢复到数据库之中;
原理:mysql中的binlog日志,用来记录mysql内部增删改查的等对mysql数据库有更新内容,依靠足够长度的binlog日志和定期的全备,我们可以恢复任意时间点的表单数据。1
2
3
4
5
6
7
8
9
10
11
12#语法
#mysqlbinlog 解析mysql的binlog日志
mysqlbinlog -d 库名 bin-log[日志文件] > 库名_operi.sql #可以将bin-log中所有对库操作的SQL语句导出
mysqlbinlog bin-log[日志文件] --start-position=365 --stop-position=456 -r 恢复的库名_operi.sql #位置数范围恢复
mysqlbinlog bin-log[日志文件] --start-datetime="2018-1-1 21:22:22" --stop-datetime="2018-1-3 21:22:22" -r 恢复的库名_operi.sql #通过时间范围恢复数据
#参数:
-d :指定库名
--start-position :指定开始位置 # at 位置数
--stop-position :指定结束位置
--start-datetime : 指定开始时间 # 时间
--stop-datetime : 指定结束时间
注意使用之前必须开启在配置中开启增量备份(主要是完成记录数据库的增删改查):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#author:WeiyiGeek 博客
#配置文件中加入log-bin
[mysqld]
log-bin=mysql-bin # 将前面的#去掉,后面的增量备份名可以更改;
#重启MySQL
/etc/init.d/mysqld restart
#进行对数据库简单操作
create table `test`(
`id` INT(5) NOT NULL DEFAULT 0,
`name` CHAR(128) NOT NULL DEFAULT 'undefine'
);
insert into test value (1,"test"),(2,"www"),(3,"java");
在mysql安装目录中的data目录中,便能找到存在我们增量备份:
注意: bin-log 注意它会记录所有数据库的更改记录,所有我们需要对其进行分段,使其更快更好的查找我们需要恢复的数据,如果无bin-log数据有可能导致有些数据删除了不能更快的找回来;
1 | #不能停住数据库的思路 |
1 | #方式1.实战将binlog全部导入 |
描述:在实际运维中常常会发生将表中的数据进行update 以及 delete 等SQL语句未加WHERE条件时候,当日志记录没有开启时候,我们只能通过binlog文件进行查验导出恢复;
注意事项:binglog格式必须是ROW1
2
3
4#1.查看 binlog 文件列表
mysql> show binary logs;
#2.指定 inlog 文件查看
mysql> show binlog events in 'mysql-bin.000008';
1.update误操作恢复1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58#环境假设
update user set flag = 1 #此时没加上条件导致数据被该
#恢复流程与步骤如下
#1.如何数据库是在线上的话比较复杂,要先进行锁表,以免数据再次被污染;
mysql> lock tables t1 read ;
#2.查看当前写的二进制文件
mysql> show master status;
# +------------------+----------+--------------+------------------+
# | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
# +------------------+----------+--------------+------------------+
# | mysql-bin.000024 | 1852 | | |
#3.分析二进制日志,并且在其中找到相关记录
#通过关键字
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000024 | grep -B 15 'zhuhai' #下十五条
#通过时间段
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS binlog.000004 --start-datetime="2020-3-1 01:33:23" --stop-datetime="2020-3-1 01:40:22" | grep -C 5 --color "@4=3" > 1.txt
#200301 1:33:23 server id 1 end_log_pos 1033911 CRC32 0x19eac976 Xid = 35805 COMMIT/*!*/;
# at 1033911
--
### UPDATE `student`.`user`
### WHERE
### @1=49 /* SHORTINT meta=0 nullable=0 is_null=0 */
### @2='杜邦能' /* STRING(128) meta=65152 nullable=0 is_null=0 */
### @3=1 /* TINYINT meta=0 nullable=1 is_null=0 */
### @4=3 /* TINYINT meta=0 nullable=1 is_null=0 */
### @5=1583055203 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
### SET
### @1=49 /* SHORTINT meta=0 nullable=0 is_null=0 */
### @2='杜邦能' /* STRING(128) meta=65152 nullable=0 is_null=0 */
### @3=0 /* TINYINT meta=0 nullable=1 is_null=0 */ (误操作的部分)
### @4=3 /* TINYINT meta=0 nullable=1 is_null=0 */
### @5=1583055203 /* TIMESTAMP(0) meta=0 nullable=1 is_null=0 */
#3.处理分析处理的二进制日志采用sed
sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' t1.txt | sed -r '/WHERE/{:a;N;/@4/!ba;s/### @2.*//g}' | sed 's/### //g;s/\/\*.*/,/g' | sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g' | sed '/^$/d' > recover.sql
grep -vE '@5' recover.sql > recover1.sql #排除@5的一行
# 处理后的SQL
# UPDATE `student`.`user`
# SET
# @1=49 ,
# @2='杜邦能' ,
# @3=1 ,
# @4=3 ,
# @5=1583055203 ,
# WHERE
# @1=49 ;
# @5=1583055203 ,
#4.将文件中的@1,@2,@3,@4替换为t1表中id,name,sex,address字段,并删除最后字段的","号
sed -i 's/@1/id/g;s/@2/name/g;s/@3/flag/g;s/@4/grade/g;' recover1.sql
sed -i -r 's/(grade=.*),/\1/g' recover1.sql
#5.登录MySQL数据库然后导入SQL语句恢复数据
mysql> source recover.sql;
2) delete 误操作恢复1
2
3
4
5
6
7
8
9
10
11
12
13
14#1.找到时间和POSITION位置节点,并且打印关键字之间的行
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000004 | sed -n '/### DELETE FROM db01.t1/,/COMMIT/p' > delete.txt
### DELETE FROM db01.t1
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='daiiy' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
### @4='guangzhou' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
#2.SQL语句转换
cat delete.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@4.*),/\1;/g' | sed 's/@[1-9]=//g' > t1.sql
#3.导入数据
mysql> source t1.sql
案例图解:
解决流程:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
541) 判断关联业务哪一个数据库出现错误,查看SQL语句执行历史查看是什么问题导致业务中断;
2) 我们从10:11接收,停止从库,然后再将Binlog把mysql-bin.0000004 恢复成 bin.sql 并且 去掉drop语句;
3) 把0点的前面全备bak_00:00:00.sql以及10点前的增量bin.sql恢复到从库;
4) 数据丢多少?10:10分刷新BINLOG以后的数据 mysql-bin.00003;
5) 停止主库,快速把mysql-bin.00003解析为sql,恢复到从库切换到从库提供服务;
6) 晚上某个时间节点将从库的数据重新灌入到主库中,恢复主从复制;
7) 后期数据库权限关联思想调整
#-------------环境假设---------------------
$ mysql -uroot -p12356 -S /data/3306/mysql.sock
//数据库字符集 utf8 | 数据库校对规则:utf8_general_ci 不区分大小写
mysql> create database weiyigeek DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
//ci是case insensitive的缩写,意思是大小写不敏感;
//相对的是cs,即case sensitive,大小写敏感;
//还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。
mysql> create table study (
`id` int(4) not NULL,
`name` CHAR(255) not NULL
);
//插入数据
mysql> insert into study values(1,'WeiyiGEEK');
Query OK, 1 row affected (0.09 sec)
mysql> select * from study;
+----+-----------+
| id | name |
+----+-----------+
| 1 | WeiyiGEEK |
| 2 | test |
| 2 | testdemo |
| 45 | testdemo |
| 41 | testdemo |
+----+-----------+
5 rows in set (0.00 sec)
//0点全备
[root@WeiyiGeek data]# mysqldump -uroot -pSystem123@ -S /data/3306/mysql.sock -B weiyigeek -F --events|gzip > bak_`(date +%F)`.sql.gz && ll
//再插入数据
mysql> insert into study values(1204,'Geek');
Query OK, 1 row affected (0.01 sec)
mysql> insert into study values(12,'adddGeek');
Query OK, 1 row affected (0.04 sec)
mysql> insert into study values(12,'GeekAdd');
Query OK, 1 row affected (0.01 sec)
// 10:00 执行了错误得语句
mysql> drop table study;
Query OK, 0 rows affected (0.03 sec)
解决实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68Step1.增量恢复得重点,判断业务是否可以暂停;通过防火墙禁止WEB等应用向主库写数据或者锁表,穰主库暂时停止更新,然后再进行恢复。
Step2.检查全备并且解压
-rw-r--r-- 1 root root 777 Mar 27 00:12 bak_2019-03-27.sql.gz
[root@WeiyiGeek 3306]# gzip -d bak_2019-03-27.sql.gz
-rw-r--r-- 1 root root 2094 Mar 27 16:12 bak_2019-03-27.sql
Step3.检查增量备份
[root@WeiyiGeek data]# grep -i "change" bak_2019-03-27.sql #来判断MYSQL增量文件
[root@WeiyiGeek data]# grep -i "completed " bak_2019-03-27.sql
-- Dump completed on 2019-03-27 00:12:17
-rw-r----- 1 mysql mysql 1001 Mar 27 10:17 binlog.000006
Step4.当机器不能暂停得时候mysqladmin进行刷新bin-log #我们恢复得目标就是000006了
mysqladmin -uroot -pSystem123@ -S /data/3306/mysql.sock flush-logs
Step5.拷贝我们刷新后binlog文件(恢复目标)到其他文件中,防止误操作 , 采用mysqlbinlog 将binlog 解析为sql
cp binlog.000006 ../server/backup/
$ mysqlbinlog -d weiyieek binlog.000006 > bin.sql
mysqlbinlog mysql-bin.0000* > bin.sql #或者 mysqlbinlog mysql-bin.00001 mysql-bin.00002 > bin1.sql
Step6.找到误操作语句进行删除
$ grep -n "DROP" bin.sql
92:DROP TABLE `study` /* generated by server */
Step7.登陆到数据库找到一个关键 sql_log_bin 点,当我们导入备份数据后得时候不记录到bin-log日志中
#同时如果业务没有中断还在写数据这时候用户得数据也不写进bin-log日志里面了,所以恢复得时候需要注意(业务停还是没有停)。
mysql> show variables like '%log_bin%';
+---------------------------------+-------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------+
| log_bin | ON |
| log_bin_basename | /data/3306/binlog |
| log_bin_index | /data/3306/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin(important) | ON |
+---------------------------------+-------------------------+
mysql> set GLOABL sql_log_bin = OFF; #当前会话生效。
Step8.导入全备与其增量备份
mysql -uroot -pSystem123@ -S /data/3306/mysql.sock < bak_2 019-03-27.sql
mysql -uroot -pSystem123@ -S /data/3306/mysql.sock < bin.sql
Step9.进入查看恢复得数据
mysql> select * from study;
+------+-----------+
| id | name |
+------+-----------+
| 1 | WeiyiGEEK |
| 2 | test |
| 2 | testdemo |
| 45 | testdemo |
| 41 | testdemo |
| 1204 | Geek |
| 12 | adddGeek |
| 12 | GeekAdd |
+------+-----------+
#以上方案不会有主键冲突问题。
1) 备份与字符集修改导入
1 | 1.人为SQL造成的误操作 |
1 | #!/bin/bash |
环境准备:1
2
3
4
5
6
7测试环境: Server 2008 R2
所需软件:
- MySQLdump.exe
- msvcp120.dll x64/x86
- msvcr120.dll x64/x86
- powershell
- 7z
设置PowerShell策略:1
2
3
4
5
6PS C:\Users\Administrator> Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
执行策略更改
执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies
帮助主题中所述的安全风险。是否要更改执行策略?
[Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): Y
注册 mysqldump 依赖的dll
1
2regsvr32 msvcr120.dll
regsvr32 msvcp120.dll
数据库相关信息查看:
1 | -- # 1.版本 |
备份脚本一览:
1 | # ------------------------------- # |
定时任务设置:1
2# 每周5的一点进行备份同步(不管用户是否登陆)
schtasks /create /TN mysql-backup /SC WEEKLY /D FRI /ST 01:00 /TR "powershell.exe d:\mysql\backup.ps1" /NP
问题1:忘记的MySQL密码重置密码
单实例方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#停止mysql服务
/etc/init.d/mysqld stop
#忽略授权登录验证
mysqlsafe --skip-grant-tables --user=mysql &;
#直接空密码登录
mysql -uroot -p
#使用update方式修改密码
UPDATE mysql.user SET password = PASSWORD("new_pass") WHERE user='root' and host='localhost';
flush privileges; #任何时候都要记住改密的啥时候都要更新权限;
#采用mysqladmin来停止mysqlsafe服务
mysqladmin -uroot -pnew_pass shutdwon
/etc/init.d/mysqld start #重启即可
多实例的方法:1
2
3
4
5
6
7
8
9
10
11
12
13#kill掉所有的mysql进程
killall mysql
#使用多实例的配置文件与 --skip且必须放在后面
mysqld_safe --default-file=/data/3306/my.cnf --skip-grant-table;
#然后多实例登录修改密码 (这时密码为空)
mysql -uroot -p -S /data/3306/mysql.sock
#同样采用上面的update方法修改密码
#然后重启服务用新密码登录
killall mysqld
/data/3306/mysql restart
问题2:认证插件问题
在安装mysql5.8后采用了最新的加密插件caching-sha2-password,用客户端连接比如navicate会提示客户端连接caching-sha2-password,是由于客户端不支持这种插件,可以通过如下方式进行修改:authentication plugin ‘caching_sha2_password’
mysql5.8开始将caching_sha2_password作为默认的身份验证插件
在MySQL 5.7中默认的身份验证插件是 mysql_native_password!
1 | # mysql_native_password 密码认证方法 |
问题3:MySQL服务器内存太小问题
检查一下 linux 系统的虚拟内存大小,如果内存不足 1G,启动 mysql 的时候可能会产生下面这个错误提示: 1
2Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.[FAILED]
起初安装的时候使用的是虚拟机自动分区,内存设置的是 1G,结果在这上面话费了大量的精力和时间去调试始终也启动没成功。
问题4:用户权限问题不能创建PID
出错如下:Starting MySQL..The server quit without updating PID file (/usr/local/mysql/var/localhost.localdomain.pid)
解决方法:配置PIDfile路径或者使用root用户启动mysql
问题5:读取预读时间太长
问题:Reading table information for completion of table and column names , You can turn off this feature to get a quicker startup with -A
原因:导致一般产生这个问题是由于MYSQL中数据库太大,导致读取预读时间太长,从而显示这个提示,如果之前都没有遇到这个问题,那么产生这个问题的原因可能是由于有改变数据库信息的操作,比如drop一个很大的表(几千万数据)而中途终止1
2
3
4
5
6
7#方法1:
登录时候指定 -A 参数
#方法2:
mysql> show processlist ;
图中锁表的id为16545618,则可以使用kill命令,结束它.
mysql> kill 16545618;
问题6:多实例mysql无法启动问题
故障:利用脚本启动mysql总是Running,进程中也没有显示ps -ef /data/3306/mysqld start
原因:由于上次没有正常退出,导致sock文件未删除关闭;
解决方法:1
2$ rm -rf /data/3306/mysql.sock /data/3306/*pid
$ /data/3306/mysql restart
问题7: MySQL数据库备份入坑记录
问题1:mysqldump : got error 1556, you can’t user lock with log tables,when using LOCK TABLES;
原因:mysql默认数据库里的logs表,不能被加锁(Lock tables)引起的
1
2 #解决方法1:把mysql这个默认数据库相关的语句清空后,文件可以正常运行 (备份时候最后加入-B/-F)
> mysqldump -uroot -ptest -B -F --single-transaction eshop|gzip>$bakpath/eshop_$(date +%F).sql.gz
问题8: MySQL主从同步入坑记录
问题:主从同步last-error = 1007 ,无法创建数据库(DB_Create_exists)
1
2
3
4
5
6
7
8
9
10 #解决方法1:主从数据不一致更重要还是保持主从同步只续状态更重要。
> stop slave;
> set global sql_slave_skip_counter = 1; #忽略跳过错误,根据业务需求来决定。
> start slave;
#解决方法2:根据错误号跳过指定的错误(从库my.cnf配置文件修改)
slave-skip-errors = 1032,1062,1007
#或者但不建议使用all值忽略所有的错误信息。
#slave-skip-errors = all
# 不同的数据库版本会引起不同步,低版本到高版本可以,但是高版本不能向低版本同步。
问题9:导入全备恢复到数据库从中
问题:mysql eshop </home/xxx/esho.0624.sql
ERROR 1030 (HY000) at line 46: Got error -1 from storage engine
1 | 1.首先看看数据库备份内容是否异常 |
问题10:增量数据库恢复规则
mysqlbinlog mysql-bin.000014mysql-bin.000015 –start-datetime=’2014-06-24 02:23:00’ >bin.sql
mysqlbinlog: unknown variable ‘default-character-set=utf8’
1 | #解决方法:添加--no-defaults参数开始增量恢复 |
问题11:强制killall停止mysql导致的错误
查看/var/log/mysql/err.log日志可以看到:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16InnoDB: Error: auto-extending data file ./ibdata1 is of a different size140624 18:51:58 [ERROR] Plugin 'InnoDB' init function returned error.
140624 18:51:58 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140624 18:51:58 [ERROR] Unknown/unsupported storage engine: InnoDB
140624 18:51:58 [ERROR] Aborting
#原因:强制终止了进程或者改变了数据文件即强制关闭服务导致innodb表空间或文件异常
#解决流程:
1.根据常规判断及历史记录(history命令行及/root/.mysql_history文件)
2.找到数据库的配置文件/etc/my.cnf
进而找到了数据库安装路径/install/mysql
数据文件路径/data/mysql
binlog的路径/data/mysql
db备份路径/home/xx/
3. 检查binlog是否完整,全备是否有效
4. 然后利用问题9解决方法进行恢复
问题12:mysq8首次登陆显示ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement
远程:MySQL版本5.6.6版本起,添加了password_expired功能,它允许设置用户的过期时间。这个特性已经添加到mysql.user数据表,但是它的默认值是”N”,可以使用ALTER USER语句来修改这个值。1
2
3
4#解决方法
mysql> ALTER USER USER() IDENTIFIED BY 'Xiaoming250'; #MySQL版本5.7.6版开设
ALTER USER 'xiaoming'@'localhost' PASSWORD EXPIRE; #将账号密码强制到期:
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER; #禁用到期
问题13:MySQL中”Invalid default value”错误解决方法
描述:在插入SQL语句的时候由于设置了time和default 0000-00-00导致报错1
2
3
4
5
6#原因1:datetime类型只支持mysql 5.6.5+.
CREATE TABLE `sys_expense` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`createtime` datetime DEFAULT CURRENT_TIMESTAMP,
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='报销表';
#解决办法:将datetime修改成为timestamp;
1 | #原因2:由于time、datetime类型在5.7之后默认不在支持0000-00-00,会导致上面的错误 |
问题14:PowerShell引发mysqldump导出文件的字符集错误
问题描述:尝试使用PS执行mysqldump导出数据库,发现导出的数据库有中文乱码的问题,用vscode发信导出的sql文件是utf-16,而数据库默认的字符集是utf-8;
问题解决思路:1
2
3
4
5# (1) 尝试采用Out-File模块指定编码格式,执行后tbl_test.sql文件打开的默认编码已经是utf-8但是里面的文依然还是乱码。
mysqldump -uroot -p --default-character-set=UTF8 --databases test_db --tables tbl_test --hex-blob | Out-File E:\Temp\tbl_test.sql -EnCoding UTF8
# (2) 最终的解决办法直接在命令行中指定`--result-file`参数
mysqldump -uroot -p --default-character-set=UTF8 --databasestest_db --tables tbl_test --hex-blob --result-file=E:\Temp\tbl_test.sql
参考地址:https://dev.mysql.com/doc/refman/5.5/en/mysqldump.html
问题15:mysql出现unblock with ‘mysqladmin flush-hosts’
问题描述: 系统应用登录的时候提示MySQL连接超时, 此时应用和数据库是否都正常,且数据库没有问题但是应用日志报无法连接数据库。
错误信息:1
2
3
4
5
6# 数据库版本是:5.5.53
# telnet 8.8.9.9 3306
# Trying 8.8.9.9...
# Connected to 8.8.9.9.
# Escape character is '^]'.
# gHost 'kapp' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.
错误原因: 同一个ip在短时间内产生太多(超过mysql数据库max_connect_errors的最大值)中断的数据库连接而导致的阻塞;max_connect_errors
是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors
的值与性能并无太大关系,默认是10,不知道为何改为了2。意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)2次 ,则MySQL会无条件强制阻止此客户端连接。所以如果max_connect_errors设置过小,则网页可能提示无法连接数据库服务器。1
2
3
4
5
6> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| max_connect_errors | 2 |
+--------------------+-------+
解决办法:如果希望重置此计数器的值,则必须重启MySQL服务器或者执行mysql> flush hosts; 命令。当这一客户端成功连接一次MySQL服务器后,针对此客户端的max_connect_errors会清零。
1 | # 解决方法1:修改max_connect_errors的值 |
问题16:利用mysqldump进行备份出现Error: ‘Access denied; you need (at least one of) the PROCESS privilege(s) for this operation’ when trying to dump tablespaces错误
问题环境: MySQL/8.0.24
问题描述: 在虚拟机的 centos7 上备份数据库,执行脚步时报错 mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
。
解决办法:1
2
3
4
5
6# 用户只有本机可以访问的执行如下命令授权PROCESS 权限
GRANT PROCESS ON *.* TO '数据库用户名'@''localhost'';
# 用户全局可以访问的执行如下命令授权PROCESS 权限
GRANT PROCESS ON *.* TO '数据库用户名'@''%'';
# 最后刷新权限
flush privileges;
问题17.程序连接到mysql服务端时报 java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
错误。
问题环境: MySQL/8.0.24
问题描述:1
202-18 06:51:09.429 ERROR [com.alibaba.druid.pool.DruidDataSource ] - create connection SQLException, url: jdbc:mysql://cmsmysql:3306/web?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/ShangMultiQueries=true, errorCode 0, state 08001
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
问题原因: 如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者加上AllowPublicKeyRetrieval=True
参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True 可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启
解决办法: 可以将jdbc连接字符串改为 jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
根据mysql的头文件 /mysql/include/mysqld_error.h 整理而成
1 | 1005:创建表失败 |
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/数据存储/Database-运维/MySQL/基础知识/4-MYSQL容备与入坑.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2019/3-26-84.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议