MySQL 데이터베이스 백업 + 복원

mysql 백업 및 복원

  • 1. 물리적 콜드 백업 및 복구

1. 데이터베이스 및 데이터 준비

mysql> create database t325;

mysql> use t325

mysql> create table biao1 (id int,name char(10));

mysql> insert into biao1 values (1,'zhang1');

mysql> insert into biao1 values (2,'zhang2');

mysql> select * from biao1;

mysql> exit

2. 콜드 백업 데이터베이스

[root@localhost ~]# cd /

[root@localhost /]# mkdir backup

[root@localhost /]# /etc/init.d/mysqld stop

[root@localhost /]# tar -zcf /backup/t325_all-$(date +%F).tar.gz /usr/local/mysql/data/

[root@localhost ~]# ll /backup/
总用量 736
-rw-r--r--. 1 root root 752674 1124 14:47 t325_all-2020-11-24.tar.gz

분석:

오늘날 기간 얻기 : 직접 같은 시스템 변수를 호출 할 수있는 셸 리눅스 시스템 시간 date +%Y%m%d이나 date +%F또는 $ (날짜 + %의 Y %의 m %의 d)

[root @ localhost ~] # tar -zcvf /backup/t325-(date+%F).tar.gz / usr / local / mysql / data # 여기에서 볼 수 있듯이 (bash 스크립트에서. $ from a variable 시작.)
bash :`( '기호 근처에서 예기치 않은 구문 오류

[root @ localhost ~] # date +%F
bash : 2020-11-25 : 명령을 찾을 수 없습니다 ...

3. 콜드 백업 데이터 복원

[root@localhost /]# /etc/init.d/mysqld stop(关闭情况下可省略这一步)

[root@localhost /]# mkdir bak                                #创建用于恢复的目录

[root@localhost /]# mv /usr/local/mysql/data/   /bak/        #将存放数据库的“主配置文件”移动到bak目录下,模拟故障!!!    …mysql目录下不只有data目录

[root@localhost /]# /etc/init.d/mysqld start
报错,数据库出错
[root@localhost /]# mysql -u root -p123.com
无法登陆

[root@localhost ~]# tar -zxvf /backup/t325_all-2020-11-24.tar.gz -C /tmp/    #不能直接解压到“/usr/local/mysql目录”,因为它打包的是“/usr/local/mysql/data”目录
[root@localhost tmp]# mv /tmp/usr/local/mysql/data/ /usr/local/mysql/

[root@localhost /]# /etc/init.d/mysqld start
启动正常{
    
    Starting MySQL.. SUCCESS! }
  • 둘째, mysqldump 백업 및 복구

1. mysqldump는 데이터베이스의 테이블을 백업합니다.

mysqldump -u username -p password library name table name> save path / file name.sql # 지정된 라이브러리의 테이블을 SQL 스크립트로 내보내기 (따라서 .sql은 변경할 수 없음)

[root@localhost /]# mysqldump -u root -p123.com t325 biao1 > /bak/t325-biao1.sql  {其实不加dump也行}
但不加dump的后果:
[root@localhost ~]# mysql -u root -p123.com t325 </bak/t325db.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'mysql  Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using 
EditLine wrapper
Copy' at line 1

2. 백업 데이터베이스 {덤프를 추가해야 함}

[root@localhost /]# mysqldump -u root -p123.com --databases t325 > /bak/t325db.sql

3. 모든 데이터베이스 백업

[root@localhost /]# mysqldump -u root -p123.com --all-databases > /bak/all-db.sql

4. 백업 파일의 내용보기

[root@localhost /]# grep -v "^--" /bak/abcdb.sql | grep -v "^/" |grep -v "^$"         {
    
    --:解释说明;   /:查找说明;      ^$:空行}

5. 백업 복원

[1] 시뮬레이션하여 테이블 데이터 수정 :
mysql> update biao1 set name = 'zhang3'여기서 id = 2;
복원하는 두 가지 방법 :

1.[root@localhost /]# mysql -u root -p123.com  t325< /bak/t325db.sql
2.[root@localhost ~]# mysql -u root -p123.com t325 </bak/t325-biao1.sql
如果你不加t325:
将会[root@localhost ~]# mysql -u root -p123.com </bak/t325-biao1.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1046 (3D000) at line 22: No database selected

[root@localhost /]# mysql -u root -p123.com -e 'show tables from t325'          //只能看到表t325,而无法看到其中数据!
[root@localhost ~]# mysql -u root -p123.com -e 'update t325.biao1 set name='zhang3' where id=2;'            //不能在命令行中修改表中数据

[2] 시뮬레이트하여 데이터베이스 삭제 후 복원 :

mysql> drop database t325;
Query OK, 1 row affected (0.09 sec)
[root@localhost /]# mysql -u root -p123.com  t325< /bak/t325db.sql                // 他会报错
[root@localhost /]# mysql -u root -p123.com  < /bak/t325db.sql                    //正确写法!!!

[root@localhost /]# mysql -u root -p123.com -e 'show databases; '                //查看MySQL数据库中有那些数据库~
  • 3. 증분 백업 / 복원 사례

증분 백업은 바이너리 로그 mysqlbinlog로 구현되며, 로그가 열리면 select를 제외한 모든 사용자의 명령문이 로그에 기록됩니다.

1. mysql 구성 파일 my.cnf를 구성하고 binlog 로그 기능 ~을 켜고 로그 파일 경로 / 이름을 설정합니다.

[root @ localhost ~] # vim /etc/my.cnf 또는 vim /usr/local/mysql/my.cnf
추가 :

log-bin=/usr/local/mysql/mysql-bin                         //指定日志文件存储位置+名字!!
解析:“log-bin=”后的字符串为日志记载目录,一般建议放在不同于MySQL数据目录的磁盘上

[root@localhost ~]# /etc/init.d/mysqld stop
[root@localhost ~]# /etc/init.d/mysqld start               //必须重启服务,否则找不到日志文件存放目录!!!
以上两步可以和为一步:
[root@localhost mysql]# systemctl restart mysqld

[root @ localhost ~] # ll / usr / local / mysql / // 로그 파일이 유효한지 확인

위 단계 후에 내 컴퓨터를 다시 시작할 수 없습니다.
내 방식

log-bin=qw                                                //它这个保存的名字随便,但是他会在data下显示日志文件~    {
    
    还有就是 只添加log_bin也行,但是默认名称为主机名}
[root@localhost ~]# ll /usr/local/mysql/data/             {
    
    里面一开始看不到qwer相关的文件!!!}
重启完之后发现
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# ll /usr/local/mysql/data/             #发现多出来这两个文件
-rw-rw----. 1 mysql mysql      120 11月 24 19:50 qwer.000001                  #注意:这里的000001是准备开始记录接下来的“操作”,直到第二次“刷新”或“重启服务”才会截止
-rw-rw----. 1 mysql mysql       14 11月 24 19:50 qwer.index

2. 데이터베이스 생성, 테이블 생성, 데이터 추가

[root @ localhost ~] # mysql -u root -p123.com

mysql> create database abc;
mysql> use abc;
mysql> create table user_info (id char(20),name char(20),sex char(4),user_id char(10),xiaofei int);

mysql> insert into user_info values ('a001','zhang1','M','0001',120),('a002','zhang2','W','0002',100),
('a003','zhang3','M','0003',90),
('a004','zhang4','W','0004',160),
('a005','zhang5','M','0005',30),
('a006','zhang6','W','0006',80);

mysql> select * from user_info;

3. 먼저 전체 백업을 만드십시오.

[root@localhost ~]# mkdir /bak
[root@localhost ~]# mysqldump -u root -p123.com abc user_info > /bak/abc_user_inf-$(date +%F).sql       
                                                                    -$(date +%F):会显示当前的时间
[root@localhost ~]# ll /bak
生成新的二进制文件
[root@localhost ~]# mysqladmin -uroot -p123.com flush-logs              
//为了让日志文件同步(即到此qwer.000001结束,但是你查看存放目录时会发现有000002文件{
    
    它是记录接下来的操作}

4. 새 데이터 추가

[root @ localhost ~] # mysql -u root -p123.com

mysql> use abc;

mysql>  insert into user_info values ('a007','zhang7','M','0007',120),('a008','zhang8','W','0008',100);

[root@localhost ~]# mysqladmin -uroot -p123.com flush-logs                   //为了让日志文件同步{即新添加的数据保存到>>qwer.000002日志文件中了}

또는

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

[root @ localhost ~] # ll / usr / local / mysql /

5. 로그 파일 복사
[root @ localhost ~] # cp /usr/local/mysql/mysql-bin.000002 / bak # 쉽게 복구 할 수 있도록 소스 로그 파일을 / bak에 복사합니다! ! !

표 삭제

[root@localhost ~]# mysql -u root -p123.com -e "drop table abc.user_info"

효과보기

[root@localhost ~]# mysql -u root -p123.com -e "show tables from abc"

6. 데이터베이스의 테이블 및 데이터 복원

전체 복구를 수행하십시오.

[root@localhost ~]# mysql -u root -p123.com abc < /bak/abc_user_inf-2018-05-04.sql 

[root@localhost ~]# mysql -u root -p123.com -e "show tables from abc"                //查看abc库中有哪些表

[root@localhost ~]# mysql -u root -p123.com -e "select * from abc.user_info"        //查看abc库里面的user_info表中的数据

누락 후 추가 된 데이터

[root @ localhost ~] # mysqlbinlog --no-defaults /bak/mysql-bin.000002 | mysql -u root -p123.com // 000002 로그 파일을 데이터베이스에 "복원"

[root @ localhost ~] # mysql -u root -p123.com -e "select * from abc.user_info"
데이터 복구가 성공했습니다! ! !

로그 파일 정보보기 :
[root @ localhost ~] # mysqlbinlog --no-defaults /bak/mysql-bin.000002 at 키워드와 id를 찾습니다.

  • 위치 기반 복원 {Position : location}

복구 형식 :
mysqlbinlog --no-defaults --start / end-position = 'ID 번호 다음에 at'/ backup 파일 경로 / 백업 파일 이름 | mysql -uroot -p 암호
[1] 로그의 지정된 위치에서 시작 회복:

[root@localhost ~]# mysqlbinlog --no-defaults --start-position='1906' /bak/mysql-bin.000003 | mysql -uroot -p123.com
--start-position:起始恢复id 

[2] 지정된 로그 파일 내용의 "끝 위치"에서 복구

[root@localhost ~]# mysqlbinlog --no-defaults --stop-position='1906' /bak/mysql-bin.000003 | mysql -uroot -p123.com
解析:
--stop-position:结束id
BEGIN
结束id必须是这里面的最后一个at任务所位于的那个id,才能体现出效果
下一个BEGIN

[3] 복구 로그에서 두 위치 사이의 데이터 :

[root@localhost ~]# mysqlbinlog --no-defaults --start-position='1906' --stop-position='2315' /bak/mysql-bin.000003 | mysql -uroot -p123.com
这里的ID则不需要最后一个!

  • 시점 {datetime : date time}을 기준으로 복원

복구 형식 :
mysqlbinlog --no-defaults --start / end-datetime = 'at the time'/ backup file path / backup file name | mysql -uroot -p password

【1】 지정된 시작 시간 후에 데이터를 복원 :

root @ localhost ~] # mysqlbinlog --no-defaults --start-datetime = '2018-5-4 17:27:00'/bak/mysql-bin.000003 | mysql -uroot -p123.com

[2] 지정된 시간 이전에 데이터를 복원하십시오.

[root @ localhost ~] # mysqlbinlog --no-defaults --stop-datetime = '2018-5-4 17:27:00'/bak/mysql-bin.000003 | mysql -uroot -p123.com

解析:
--stop-datetime:结束时间
BEGIN
结束时间必须是这里面的最后一个at任务所位于的那个时间点,才可以生效
下一个BEGIN

【3】 지정된 시간 범위에서 데이터 복원 :

[root @ localhost ~] # mysqlbinlog --no-defaults --start-datetime = '2018-5-4 17:27:00'--stop-datetime = '2018-5-5 17:27:00'/ bak / mysql-bin.000003 | mysql -uroot -p123.com

여기에서 볼 수 있습니다.
시점은 at 작업의 수를 기반으로 할 수 없습니다 [그렇지 않으면 시간이 동일합니다]. 시작과 다음 시작 사이의 마지막 날짜 및 시간을 기반으로 합니다.

[4] 지정된 시간의 데이터를 지정된 위치로 복원합니다.

[root @ localhost ~] # mysqlbinlog --no-defaults --start-datetime = '2018-5-4 17:27:00'--stop-position = '2315'/bak/mysql-bin.000003 | mysql -uroot -p123.com

끝 위치는 마지막 작업의 ID로 지정됩니다 [시작 ~ 다음 BEGIN 사이]

요약하자면 :

1.只要是结束位置,必须是【BEGIN~下一个BEGIN之间的】最后一个“时间”或“at任务”的编号!!!
2.数据库基于***的恢复,其实它不是恢复!而是将“你所指定的那个范围内的命令语句”再次执行一下!!!
3.当你把表删除后,自然就不能恢复“表中的数据”了!!!

여러분의 격려는 지속적인 개선을위한 저의 동기입니다 (# ^ . ^ #)

여기에 사진 설명 삽입

LAMP 환경 구축

추천

출처blog.csdn.net/qq_50573146/article/details/110149251