MySQL 的日志默认保存位置为 /usr/local/mysql/data ,MySQL 的日志配置文件为 /etc/my.cnf
用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
vim /etc/my.cnf
log-error=/home/mysql/mysql_error.log ##指定日志的保存位置
用来记录MySQL的所有连接和语句,默认是关闭的
vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
用来记录所有当MySQL启动、停止或运行时发送的错误信息,默认是关闭的
vim /etc/my.cnf
log-bin=mysql-bin
或
log_bin=mysql-bin
#使用相对路径,则文件存储在默认目录/usr/local/mysql/data/中
用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
vim /etc/my.cnf
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 ##慢查询时间,设置超过5秒执行的语句被记录
show variables like 'general%';
show variables like 'log_bin%';
show variables like '%slow%';
show variables like 'long_query_time';
set global slow_query_log=ON;
##在数据库中设置开启慢查询的方法,即以修改变量值的方式开启。但重启服务后会失效。
备份的主要目的是灾难恢复。
在生产环境中,数据的安全性至关重要。
任何数据的丢失都可能产生严重的后果。
对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。
对数据库逻辑组件(如:表等数据库对象)的备份。
即以SQL语句的形式,把库、表结构、表数据保存下来。
mysqldump常用的逻辑备份工具 (导出为sql脚本)
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份 (增量备份)
进行增量备份,需要刷新二进制日志
实验准备
create database school;
use school;
create table if not exists class1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));
insert into class1 values(1,'run','male','running');
insert into class1 values(2,'he','female','singing');
InnoDB存储引擎的数据库在磁盘上存储成三个文件
systemctl stop mysqld
yum -y install xz
##压缩备份
cd /usr/local/mysql
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz data/
##进数据库把school数据库删了
##解压恢复
tar Jxvf /opt/mysql_all_2022-06-15.tar.xz -C ./
systemctl restart mysqld.service
mysql -u root -p
mysqldump是常用的逻辑备份工具。
mysqldump可以将指定的库、表导出为SQL脚本
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql #导出的就是数据库脚本文件
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
cd /opt/mysql_bak
cat yuji-market.sql | grep -v "^--" |grep -v "^/" |grep -v "^$"
systemctl start mysqld
mysql -u root -p -e 'drop database school;'
mysql -u root -p -e 'SHOW DATABASES';
mysql -u root -p < /opt/mysql_bak/school.sql
mysql -u root -p -e 'SHOW DATABASES;'
mysqldump -uroot -p school class1 > /opt/mysql_bak/school_class.sql
mysql -u root -p -e 'drop table school.class1;'
mysql -u root -p -e 'show tables from school;'
mysql -u root -p school < /opt/mysql_bak/school_class.sql
mysql -u root -p -e 'show tables from school;'
增量备份是自上一次备份后增加/变化的文件或者内容
一般恢复
基于位置恢复
基于时间点恢复
vim /etc/my.cnf
log-bin=mysql-bin
binlog_format = MIXED
##保存退出
systemctl restart mysqld
ls /usr/local/mysql/data/
##对指定的表做备份
mysqldump -u root -p school class1 > /opt/school_class1_$(date +%F).sql
##对所有的库做备份
mysqldump -u root -p --all-databases school > /opt/school_$(date +%F).sql
cd /usr/local/mysql/data/
mysqladmin -u root -p flush-logs
use school;
select * from class1;
insert into class1 values(3,'laoliu','mail','football');
insert into class1 values(4,'zhuba','mail','dancing');
mysqladmin -u root -p flush-logs
再次生成新的二进制日志文件(例如mysql -bin.000005)
##之前的的数据库操作会保存到mysql-bin.000004文件中,之后数据库数据再发生变化则保存在mysql-bin.00005文件中
mysqladmin -u root -p flush-logs
cp /usr/local/mysql/data/mysql-bin.000004 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
将所有备份的二进制日志内容全部恢复。
use school;
delete from class1 where id=3;
delete from class1 where id=4;
通过二进制日志进行恢复
由于这边出了点小问题,删了后数据恢复不了,我从插入数据那从新做了一遍
mysql -u root -p
use school;
insert into class1 values(3,'laoliu','mail','football');
insert into class1 values(4,'zhuba','mail','dancing');
select * from class1;
quit
mysqladmin -u root -p flush-logs
ls /usr/local/mysql/data/
cp /usr/local/mysql/data/mysql-bin.000006 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000006
mysql -u root -p
use school;
delete from class1 where id=3;
delete from class1 where id=4;
quit
mysqlbinlog --no-defaults /opt/mysql-bin.000006 | mysql -u root -p
mysql -u root -p -e 'select * from school.class1;'