从物理与逻辑的角度,备份可分为
物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份
从数据库的备份策略角度,备份可分为
完全备份的优点
完全备份的缺点
在生产环境中,完全备份和增量备份都会使用,需要制定合理高效的方案达到备份数据的目的,避免数据丢失造成的严重的后果
MySQL数据库的完全备份可以采用用多种方式
tar -zcvf data.tar.gz data
[root@maomao mysql]# ls
bin COPYING data data.tar.gz docs include lib man README share support-files
mysqldump命令对单个库进行完全备份
语法:
mysqldump -u 用户名 -p [密码] [选项] [数据库名] > /备份路径/备份文件名
mysqldump -uroot -p school > /home/school.sql
Enter password:
[root@maomao home]# ls
maomao school.sql
mysqldump命令对多个库进行完全备份
语法:
mysqldump -u 用户名 -p [密码] [选项] --databases 库名 1 [库名2] … > /备份路径/备份文件名
mysqldump -uroot -p --databases school maomao > /home/school-maomao.sql
Enter password:
[root@maomao home]# ls
maomao school-maomao.sql
对所有库进行完全备份
语法:
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
mysqldump -uroot -p --all-databases > /home/all-data.sql
[root@maomao home]# ls
all-data.sql maomao school-maomao.sql
对某个特定的表进行备份
语法:
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
mysqldump -uroot -p school student >/home/school_student.sql
Enter password:
[root@maomao home]# ls
all-data.sql maomao school-maomao.sql school_student.sql
使用mysqldump命令导出的SQL备份脚本,在进行数据恢复时可使用以下方法导入
使用source恢复数据库
因为之前已经备份过了 模拟数据丢失 然后恢复
直接把库删了
mysql [school]>drop database school;
Query OK, 6 rows affected (0.01 sec)
进入sql脚本的目录 登录mysql之后进行恢复
mysql [school]>source school.sql
mysql [school]>show tables;
+------------------+
| Tables_in_school |
+------------------+
| category |
| grade |
| result |
| student |
| subject |
| t_student |
+------------------+
6 rows in set (0.00 sec)
使用mysql命令恢复库数据
语法:
mysql -u 用户名 -p [密码] 库名 < 库备份脚本的路径
先把maomao库删了
mysql [(none)]>drop database maomao;
Query OK, 1 row affected (0.01 sec)
然后创建新的maomao库
create database maomao;
恢复
mysql -uroot -p maomao </home/maomao.sql
使用mysql命令恢复表数据
恢复表数据同样可以使用source或者mysql命令
source恢复表的操作与恢复库的操作相同
当备份文件中只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在
语法:
mysql -u 用户名 -p [密码] 库名 < 表备份脚本的路径
mysql -uroot -p school </home/school_student.sql
首先先创建一个专门备份的用户并且授权
create user backup identified by '123';
grant all on school.* to backup@'localhost' identified by "123";
#!/bin/bash
#auto backup mysql db
#before you back ,please grant to the user backup
#grant all on discuz.* to backup@'localhost' identified by "123456"
#flush privileges
BAK_DIR=/back
BAK_FILE=/back/full_`date +%Y%m%d`
MYSQLDB=school
MYSQLUSR=backup
MYSQLPWD=123
MYSQLCMD=/usr/bin/mysqldump
if [ $UID -ne 0 ];then
echo "You must to be use root"
exit 1
fi
if [ ! -d $BAK_DIR ];then
mkdir -p $BAK_DIR && echo -e "\033[32mcreate the backdir success\033[0m"
else
echo "THIS $BAK_DIR IS EXSITS..."
fi
mysqldump -u$MYSQLUSR -p$MYSQLPWD $MYSQLDB > $BAK_FILE.$MYSQLDB.sql
if [ $? -eq 0 ];then
echo -e "\033[32mTHE mysql backup $MYSQLDB successful!\033[0m"
else
echo -e "\033[32mTHE mysql backup $MYSQLDB faild!\033[0m"
fi
# 删除超过日期的备份
find /back -mtime +30 |xargs rm -rf
执行脚本
[root@maomao home]# bash mysql.sh
create the backdir success
mysqldump: [Warning] Using a password on the command line interface can be insecure.
THE mysql backup school successful!
备份成功
[root@maomao back]# ls
full_20210413.school.sql
增量备份的特点
MySQL没有提供直接的增量备份方法
可以通过MySQL提供的==二进制日志(binary logs)==间接实现增量备份
MySQL二进制日志对备份的意义
实现增量备份之前需要开启二进制日志功能,开启而仅仅只日志功能有两种方式:
mysql [(none)]>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
在没开启之前 log_bin的value是OFF
在MySQL配置文件的 [mysqld] 项中加入log-bin=filepath
[mysqld]
log_bin=mysql-bin
log_bin_index=mysql-bin.index
重启mysql
service mysqld restart
再次查看
mysql [(none)]>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
使用mysqld --log-bin=filepath
/etc/init.d/mysqld restart --log-bin=mysql-bin
开启二进制日志功能后 在mysql目录的data里面会出现日志文件
确定字符集使用的是utf-8的形式,避免出现乱码问题
mysql [(none)]>show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
如果不是utf8 编辑my.cnf文件
添加
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
然后使用mysqldump命令,对数据库或者表进行全量备份
每天进行增量备份操作,使用mysqladmin的选项flush-logs生成新的二进制文件
生成新的二进制文件
mysqladmin -uroot -p123 flush-logs
添加新的数据
mysql [school]>insert into student (studentno,loginpwd,studentname,gender,gradeid,phone,address,borndate,email,identitycard)
values (1008,'123456','猪猪','男',1,'13800002009','广东深圳','1999-1-30','text250@qq.com','123456199001011999');
Query OK, 1 row affected (0.00 sec)
insert into student (studentno,loginpwd,studentname,gender,gradeid,phone,address,borndate,email,identitycard)
values (1009,'123456','小宇','男',1,'13800002549','山西太原','1998-8-3','text387@qq.com','123456199001011387');
查看二进制日志
注意:如果遇到乱码可以添加参数进行解码
mysqlbinlog mysql-bin.000002
解码
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000002
解码后:
把二进制文件复制到保存备份的目录,完成增量备份
cp mysql-bin.000002 /back
ls /back
full_20210413.school.sql mysql-bin.000002
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
增量恢复之前需要全量恢复
mysql -uroot -p school </back/full_20210413.school.sql
mysqlbinlog /back/mysql-bin.000002 |mysql -uroot -p
恢复成功
恢复数据到指定位置
mysqlbinlog --stop-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码
从指定的位置开始恢复数据
mysqlbinlog --start-position=’操作 id’ 二进制日志 |mysql -u 用户名 -p 密码
恢复数据到指定位置
使用delete删除插入的两条数据
delete from student where identitycard=123456199001011999;
delete from student where identitycard=123456199001011387;
需要去查看一下备份日志里的位置点
找到位置点为499
mysqlbinlog --stop-position='499' /back/mysql-bin.000002 |mysql -uroot -p123
验证:
只恢复了499位置点上面的sql
从指定的位置开始恢复数据
先删除数据
delete from student where identitycard=123456199001011999;
跳过第一条数据的499,只恢复后面那条数据
mysqlbinlog --start-position='574' /back/mysql-bin.000002 |mysql -uroot -p123
#!/bin/bash
BAK_DIR=/back
MYSQLUSR=root
MYSQLPWD=123
# 刷新二进制日志
mysqladmin -u$MYSQLUSR -p$MYSQLPWD flush-logs
# 获取最近一次的增量备份文件
newlog=`ls -lt /usr/local/mysql/data |grep mysql-bin.0 |awk 'NR==2{print $9}'`
newlog="/usr/local/mysql/data/"$newlog
# 将备份日志保存到相应的目录
cp $newlog $BAK_DIR
# 删除超过日期的备份
find /back -mtime +30 |xargs rm -rf
制定企业备份策略要根据企业数据库的实际读写的频繁性与数据的重要性进行
0 前言 这篇文章不会讲解索引的基础知识,主要是关于MySQL数据库的B+树索引的相...
了解正向预查反向预查前,我们先要知道正则的2个函数:preg_match_all 、 preg_r...
IT之家 12 月 20 日消息目前,如果用户不小心按下 Alt+F4 键盘快捷键或点击窗口...
如今5G手机、5G基站遍布全国一说起5G是个人都能说出工业互联网、智能医疗、智慧...
内容 用脚手架快速搭建 node 项目 用 mysql 连接池实现与数据库的交互 用 jsonwe...
近日浙江省绍兴市上虞区将刷脸支付功能向基层延伸率先实现全区安全范围内的全覆...
本文实例讲述了tp5框架前台无限极导航菜单类实现方法。分享给大家供大家参考,具...
特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Alpha; #913; Beta...
问题现象 客户在初试用友云音时部署完探针后发现启动agent后并未在主机页签中注...
本文实例为大家分享了jquery点击左右按钮切换图片的具体代码,供大家参考,具体...