Mysql データベースのフル バックアップと増分バックアップとリカバリ

mysql データのバックアップ:

データのバックアップ方法

  • 物理バックアップ:
  • コールド バックアップ: コールド バックアップは、データベースが閉じられた後のバックアップを指し、すべてのモードのデータベースに適用されます。
  • ホット スタンバイ: 通常、サービスの正常かつ中断のない運用を確保するために使用されます. 2 台のマシンはサービス マシンとして使用され、1 台は実際のデータベース操作アプリケーションに使用され、もう 1 台は前者からリアルタイムでデータを取得してデータの整合性を維持します.現在のマシンがオフになると、バックアップ マシンが現在のマシンをすぐに置き換えて、サービスを提供し続けます。
  • コールド スタンバイの一般的なコマンド: cp tar scp ...
  • 論理バックアップ:
  • mysqldump //バックアップ コマンド
  • mysql/データの復元コマンド

1. 物理的なバックアップとリカバリ:

1.1. バックアップ操作:

实例1:
mkdir -p /data/mysql
cp -r /var/lib/mysql/ /data/mysql/mysql.bak
实例2:
tar -zcvf /data/mysql/mysql.tar.gz  /var/lib/mysql
实例3:
#在备份数据库创建备份目录:
mkdir /data
#备份数据
scp -r /var/lib/mysql  192.168.2.20:/data/mysql.bak

2.Mysqldump のバックアップ:

  • mysqldump のバックアップが完了する前に、すべてのテーブルがロックされ、書き込みができなくなります。

2.1. データ自体ではなく、テーブルのみをバックアップします。

备份mysql数据库中的所有表,但是不会自动生成创建mysql数据库的语句:
[root@www ~]# mysqldump -uroot -p1234  mysql  > /root/mysql.sql

2.2. データベースとテーブルのバックアップ:

备份mysql数据库中的所有表,并且会生成创建mysql数据库的SQL语句,也就是导入时不需要先创建数据库:
[root@www ~]# mysqldump -uroot -p1234 --databases mysql  > /root/mysql.sql

2.3. 複数のデータベースのバックアップ:

备份数据库MySQL、ys到/root/ys_mysql.sql
[root@www ~]# mysqldump -uroot -p1234 --databases mysql ys  > /root/ys_mysql.sql

2.4. すべてのデータベースをバックアップします。

[root@www ~]# mysqldump -uroot -p1234 --all-databases >/root/all.sql
或者:
[root@www ~]# mysqldump -uroot -p1234 -A >/root/all.sql

2.5. mysql データベースをバックアップし、pos ポイントを記録します。

[root@www ~]# mysqldump -uroot -p1234 --master-data mysql > /root/mysql.sql

2.6. データベースをバックアップし、ログを更新します。

[root@www ~]# mysqldump -uroot -p1234 --master-data --flush-logs mysql > /root/mysql.sql

2.3. データベースの復旧:

[root@www ~]# mysqldump -uroot -p1234 --databases ys > /root/ys.sql
首先把ys数据库删除
mysql> drop database ys;
Query OK, 31 rows affected, 2 warnings (0.06 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| mysql                |
| sys                 |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit
Bye
## 恢复数据库ys
[root@www ~]# mysql -uroot -p1234 < /root/ys.sql 
[root@www ~]#  mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| sys                |
| mysql              |
| ys                 |
+--------------------+
4 rows in set (0.00 sec)
 
 或者是:
 mysql> source /root/ys.sql;   ---source 命令导入数据库需要先登录到数库终端:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| sys                |
| mysql              |
| ys                 |
+--------------------+
4 rows in set (0.00 sec) 

3. 増分バックアップとリカバリ

  • 増分バックアップとリカバリの機能
  • 増分バックアップの利点は、データの重複がないこと、バックアップ ボリュームが小さいこと、時間が短いことです。しかし、欠点も明らかで、復元するには、最後の完全バックアップと、完全バックアップ後のすべての増分を確立する必要があります。

3.1. binlog ログの概要:

  1. binlog ログとは何ですか?
  2. バイナリログとも呼ばれます
  3. mysql サービス ログ ファイルの一種
  4. クエリを除くすべての SQL ステートメントをログに記録する
  5. データのバックアップとリカバリに使用できます
  6. mysql マスター/スレーブ同期を構成するために必要な条件

3.2. 起動ログ

構成アイテム 使用
server_id=番号 ID 値を指定します (1 ~ 255)
log_bin[=ディレクトリ名/ファイル名] binlog ログを有効にする
max_binlog_size=値 m binlog ログ ファイルの容量を指定します (デフォルトは 1G)。
[root@localhost ~]# vim /etc/my.cnf
修改内容如下:
[mysqld]
.....
log_bin
server_id=100
[root@localhost ~]# systemctl restart mysqld
###查看binlog日志是否开启
登录数据库
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000001 |      154 |              |                  |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

  • Binlog 関連ファイルはデフォルトで /var/lib/mysql/ に保存されます
  1. hostname-bin.index インデックス ファイル
  2. hostname-bin.000001 最初のバイナリ
  3. hostname-bin.000002 2 番目のバイナリ
    ...
  • 通常、binlog バイナリ ファイルの既定の容量は 1G であり、新しい binlog バイナリ ファイルを再作成する容量を超えています。新しい binlog ログ ファイルを生成する方法は次のとおりです。
1.重启mysql服务
systemctl   restart  mysqld
或者:
mysql  -root -p密码  -e 'flush logs'
或者:
mysqldump  --flush-logs

3.3. 増分バックアップ

  • ログをフラッシュする方法を定期的に実行して、新しいログを再作成し、バイナリ ファイル シーケンスを生成し、これらのファイルを安全な場所に保存して、一定期間の増分バックアップを完了します。
##创建数据库
create database school default charset=utf8mb4;
##创建表格
use school;
create table stuinfo(
                       -> id int primary key auto_increment,
                       -> name char(20) not null,
                       -> sex enum('boy','girl') not null,
                       -> age int unsigned not null,
                       -> likes set('run','go fishing','Listen to the music','Play basketball') default'run,play basketball');
##往stuinfo表格里插入数据
insert into stuinfo values(1,'bob','boy',25,'run,go fishing');
##查看表格数据:
select * from stuinfo;
+----+------+-----+-----+----------------+
| id | name | sex | age | likes          |
+----+------+-----+-----+----------------+
| 1  | bob  | boy | 25  | run,go fishing |
+----+------+-----+-----+----------------+
##退出数据库并使用mysqldump完全备份school数据库并重新创建一个binlog文件。
exit    ---退出数据库
mkdir /data ---创建存放数据的目录
mysqldump -uroot -p1234  --flush-logs -B school > /data/$(date +%Y-%m-%d)-school.sql
ls /data/
2023-02-14-school.sql
##进入数据库继续往表格里插入数据
use school;
insert into stuinfo values(2,'tom','boy',28,'run,play basketball');
select * from stuinfo;
+----+------+-----+-----+---------------------+
| id | name | sex | age | likes               |
+----+------+-----+-----+---------------------+
| 1  | bob  | boy | 25  | run,go fishing      |
| 2  | tom  | boy | 28  | run,Play basketball |
+----+------+-----+-----+---------------------+
##退出数据库生成增量备份文件
exit;    ---退出数据库
mysql -uroot -p1234 -e "show master status;flush logs"    ----查看当前的binlog文件名称,然后创建一个新的binlog文件
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000002 |      436 |              |                  |                   |
+----------------------+----------+--------------+------------------+-------------------+
##把localhost-bin.000002文件拷贝到/data下并修改当前日期作为增量备份文件
cp -r /var/lib/mysql/localhost-bin.000002 /data/
mv /data/localhost-bin.000002 /data/$(date +%Y-%m-%d)-localhost-bin.000002
ls /data/
2023-02-14-localhost-bin.000002  2023-02-14-school.sql

3.4. データ復旧

##删除school的所有表
drop table stuinfo;
##查看还有其他表格
show tables;
+------------------+
| Tables_in_school |
+------------------+
+------------------+
##退出数据库,恢复数据
quit;
mysql -uroot -p1234 < /data/2023-02-14-school.sql  ---先恢复完全备份的文件
mysqlbinlog /data/2023-02-14-localhost-bin.000002 | mysql -uroot -p1234  --恢复增量备份的部分。

3.5. 指定範囲のデータを復元する

  • 文法:
mysqlbinlog  选项  binlog日志名称 | mysql -uroot -p密码

ここに画像の説明を挿入

3.5.1. binlog ログファイルの表示

[root@localhost ~]# mysqlbinlog /data/2023-02-14-localhost-bin.000002

このログ形式は理解しにくいことがわかります

3.5.2. ログレコード形式の変更

##查看当前日志记录格式
mysql> show variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
三种记录格式:
1.statement    报表模式
2.row          行模式
3.mixed        混合模式

##修改日志记录格式:
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
....
binlog_format=mixed
[root@localhost ~]# systemctl restart mysqld
###查看是否修改成功
mysql> show variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.01 sec)

3.5.3. 指定した範囲のデータを復元する:

##往stuinfo表格中插入数据:
insert into stuinfo values(3,'grace','girl',20,'run,play basketball');
insert into stuinfo values(4,'andy','boy',23,'play basketball');
select * from stuinfo;
+----+-------+------+-----+---------------------+
| id | name  | sex  | age | likes               |
+----+-------+------+-----+---------------------+
| 1  | bob   | boy  | 25  | run,go fishing      |
| 2  | tom   | boy  | 28  | run,Play basketball |
| 3  | grace | girl | 20  | run,Play basketball |
| 4  | andy  | boy  | 23  | Play basketball     |
+----+-------+------+-----+---------------------+
##删除grace这个数据
delete from stuinfo where name='grace';
select * from stuinfo;
+----+------+-----+-----+---------------------+
| id | name | sex | age | likes               |
+----+------+-----+-----+---------------------+
| 1  | bob  | boy | 25  | run,go fishing      |
| 2  | tom  | boy | 28  | run,Play basketball |
| 4  | andy | boy | 23  | Play basketball     |
+----+------+-----+-----+---------------------+
##查看当前的binlog日志文件名称;
show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000006 | 1095     |              |                  |                   |
+----------------------+----------+--------------+------------------+-------------------+
### 恢复grace的数据信息
[root@localhost ~]# mysqlbinlog /var/lib/mysql/localhost-bin.000006   ---查看binlog日志内容
# at 302   ---起始pos值
#230214 17:27:39 server id 100  end_log_pos 449 CRC32 0x2dbf2580        Query   thread_id=3     exec_time=0     error_code=0
use `school`/*!*/;
SET TIMESTAMP=1676366859/*!*/;
insert into stuinfo values(3,'grace','girl',20,'run,play basketball')
/*!*/;
# at 449
#230214 17:27:39 server id 100  end_log_pos 480 CRC32 0x3116b5d3        Xid = 21
COMMIT/*!*/;      ---回车操作
# at 480          ---结束pos值
#230214 17:28:12 server id 100  end_log_pos 545 CRC32 0x0b918b41        Anonymous_GTID  last_committed=1        sequence_number=2 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 545
[root@localhost ~]# mysqlbinlog --start-position=302 --stop-position=480 /var/lib/mysql/localhost-bin.000006 | mysql -uroot -p1234
或者
[root@localhost ~]# mysqlbinlog --start-datetime="2023-02-14 17:27:39" --stop-datetime="2023-02-14 17:28:12"  /var/lib/mysql/localhost-bin.000006 | mysql -uroot -p1234
###查看是否恢复:
select * from stuinfo;
+----+-------+------+-----+---------------------+
| id | name  | sex  | age | likes               |
+----+-------+------+-----+---------------------+
| 1  | bob   | boy  | 25  | run,go fishing      |
| 2  | tom   | boy  | 28  | run,Play basketball |
| 3  | grace | girl | 20  | run,Play basketball |
| 4  | andy  | boy  | 23  | Play basketball     |
+----+-------+------+-----+---------------------+

おすすめ

転載: blog.csdn.net/weixin_45625174/article/details/121159207