数据备份的方式
物理备份
cp -r /var/lib/mysql /dbdir.bak
cp -r /var/lib/mysql/mysqldb* /mysqldb.bak
数据备份的策内
把备份的文件,拷贝会对应的数据库分目录,把所有的者和组修改为mysql 重起数据库服务器。
授权库的一定要叫mysql,要修改授权库的目录为mysql
cp -r /var/lib/mysql /dbdir.bak
cp -r /var/lib/mysql/mysql /mysqldb.bak
cp -r /var/lib/mysql/mysql/db.* /root/
tar - zcvf /mysql.tar.gz /var/lib/mysql/*
缺点:跨平台比较差,备份时间长,冗余备份,浪费空间
实操步骤:
50:
[root@host50 ~]# cp -r /var/lib/mysql/mysql/ /mysqldb.bak
[root@host50 ~]# scp -r /mysqldb.bak/ root@192.168.4.52:/root
root@192.168.4.52's password:
52:
[root@host52 ~]# systemctl stop mysqld
[root@host52 ~]# rm -rf /var/lib/mysql/mysql
[root@host52 ~]# cp -r /root/mysqldb.bak/ /var/lib/mysql/mysql
[root@host52 ~]# ls -ld /var/lib/mysql/mysql
drwxr-x---. 3 root root 4096 7月 16 18:32 /var/lib/mysql/mysql
[root@host52 ~]# chown -R mysql:mysql /var/lib/mysql/mysql
[root@host52 ~]# ls -ld /var/lib/mysql/mysql
drwxr-x---. 3 mysql mysql 4096 7月 16 18:32 /var/lib/mysql/mysql
[root@host52 ~]# systemctl start mysqld
[root@host52 ~]# ss -ntulp | grep mysqld
tcp LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=4088,fd=18))
存在的缺点:
[root@host50 ~]# du -sh /var/lib/mysql
201M /var/lib/mysql
只适合小量的数据进行备份,不适合大量的式狙击备份;
1.逻辑备份:
执行备份命令时,根据备份的库表,生产对应的sql命令, 把命令保存到指定的文件里。恢复时,执行保存sql命令的备份文件 把数据写回数据库里。
2.数据备份策类
完全备份 备份所有数据(通常包获3类对象: 一张表里的所有数据 一个库所有表 一台服务器的所有数据)
备份新产生的数据:
差异备份:备份自完全备份后所有新产生的数据
增量备份:备份上次备份后,所有新产生的数据
生产环境的使用方法:
完全+增量 完全+差异
周一做完全备份 其他做增量或差异备份
增量和差异也有各自的优缺点
生产环境中是:
使用crond服务执行备份脚本(在备份脚本调用备份命令) 做数据备份
00 23 * * 1 /root/allbak.sh ——完全备份
00 23 * * 2-7 /root/newbak.sh ——增量备份
3.备份数据和数据恢复
完全备份:mysqldum——备份所有数据
[root@host50 ~]# man mysqldump ——学会看帮助的信息
[root@host50 ~]# mysql -uroot -p123 库名 > 目录名.文件名.sql
缺点 : 备份和还原时间慢 效率低 备份过程中可能会有数据的插入和更新的同步操作:
实验步骤:
[root@host50 ~]# mkdir /bakdir
1.[root@host50 ~]# mysqldump -u root -p123456 -A > /bakdir/alldb.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2.[root@host50 ~]# mysqldump -u root -p123456 db3 > /bakdir/db3.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
3.[root@host50 ~]# mysqldump -u root -p123456 db3 user > /bakdir/db3-user.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
4.[root@host50 ~]# mysqldump -u root -p123456 -B db3 db55 > /bakdir/twodb.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
库名的表示方式:
1.--all -databases: 所有库所有表 等同于 -A
2.库名 ——备份库里的所有表,(备份库里所有数据)
3.库名.表名——备份一张表的所有记录
4.-B 库名1 库名2 备份某几个库的所有数据
完全恢复:mysql
方法:
1.[root@host50 ~]# mysql -uroot -p123456 库名 < 目录名.文件名.sql
2.mysql > sourcre 目录名.文件名.sql
实验步骤:
mysql> drop table db3.user;
Query OK, 0 rows affected (0.09 sec)
mysql> select * from db3.user;
ERROR 1146 (42S02): Table 'db3.user' doesn't exist
[root@host50 ~]# mysql -uroot -p123456 db3 < /bakdir/db3-user.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from db3.user;
+-----+---------------------+------+----------+-------+------+-----------------------------------------------------------------+---------------------------+----------------+
| id | name | age | password | uid | gid | comment | homedir | shell |
+-----+---------------------+------+----------+-------+------+-----------------------------------------------------------------+---------------------------+----------------+
| 1 | root | 18 | x | 1 | 1000 | root | /root | /bin/bash |
| 2 | bin | 18 | NULL | 2 | 2013 | bin | /bin | /sbin/nologin |
完全备份的优点和缺点:
缺点:
1.不能同步备份新产生的数据,插入 ,更新 ,删除的数据就不能备份,万一数据丢失就不能恢复,新产生的数据可以,用增量备份,
2.做完全备份和恢复,都会锁表—— 要在生产环境不忙的时候进行备份
vim /bakdir/db3-user.sql
lock tables user write
insert into
unlock tables;
优点:
可以完全备份数据
可以利用计划任务时间进行备份数据
vim /root/alldb3.sh——完全备份脚本
#!/bin/bash
if [!-e /bakdir];then
mkdir /bakdir
fi
x=`date +%F`
mysqldump -uroot -p123456 db3 > /bakdir/db3_${x}.sql
:wq
chmod + x /root/alldb3.sh
crontab -e ——创建时间周期任务
00 23 * * 1 /root/alldb3.sh &>/dev/null
:wq
crontab -l ——查看时间周期
验证脚本:
[root@host50 ~]# chmod +x /root/alldb3.sh
[root@host50 ~]# /root/alldb3.sh
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@host50 ~]# ls /bakdir/
alldb.sql db3_2018-07-17.sql db3.sql db3-user.sql twodb.sql
[root@host50 ~]# ls /bakdir/db3_2018-07-17.sql
/bakdir/db3_2018-07-17.sql
增量备份:
备份上一次备份后新产生的新数据
生存环境下是完全备份+增量备份
方法:
1.启动MYSQL 服务自带的binlog 日志文件
binlog 日志的使用:
日志的作用:
日志介绍——是服务日志文件中的一种(默认是没有启用) 记录除查询之外的sql的命令
启用日志
vim /etc/my.cnf
[mysqld]
server_id=50
log-bin
binlog-format="mixed"
:wq
[root@host50 ~]# systemctl stop mysqld
[root@host50 ~]# systemctl restart mysqld
[root@host50 ~]# ls /var/lib/mysql
host50-bin.000001
日志文件 > 500M 才会新的一个日志《最多存储的文件 999999个 这个文件不是文本文件不能用系统命令查看 ,要用专属命令查看,这个文件是用二进制编写
host50-bin.index
索引文件
日志的内容
[root@host50 mysql]# mysqlbinlog host50-bin.000001 ——初始的日志
[root@host50 mysql]# mysqlbinlog host50-bin.000001 | grep desc
实验步骤:
mysql> create table t10(id int);
Query OK, 0 rows affected (0.06 sec)
mysql> desc t10;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t10 values(111);
Query OK, 1 row affected (0.04 sec)
mysql> insert into t10 values(211);
Query OK, 1 row affected (0.02 sec)
mysql> insert into t10 values(311);
Query OK, 1 row affected (0.04 sec)
mysql> insert into t10 values(411);
Query OK, 1 row affected (0.02 sec)
mysql> select * from t10;
+------+
| id |
+------+
| 111 |
| 211 |
| 311 |
| 411 |
+------+
4 rows in set (0.00 sec)
另起一个终端检测:
[root@host50 mysql]# mysqlbinlog host50-bin.000001 | grep insert
insert into t10 values(111)
insert into t10 values(211)
insert into t10 values(311)
insert into t10 values(411)
自定义日志目录的:
mkdir /logbir
vim /etc/my.cnf
[mysqld]
server_id=50
log-bin=/logbir/db5——不指定目录 ,就是默认 /var/lib/mysql 第一是目录 第二个是文件
binlog-format="mixed"
:wq
创建数据:
mysql> creat table t10(id int);
ERROR 1064 (42000): 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 'creat table t10(id int)' at line 1
mysql> create table t10(id int);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t10 values(333);
Query OK, 1 row affected (0.03 sec)
mysql> insert into t10 values(666);
Query OK, 1 row affected (0.03 sec)
mysql> insert into t10 values(999);
Query OK, 1 row affected (0.04 sec)
mysql> select * from t10;
+------+
| id |
+------+
| 333 |
| 666 |
| 999 |
+------+
3 rows in set (0.00 sec)
另起一个终端:查看日志记录:
[root@host50 mysql]# mysqlbinlog /logdir/db50.000001 | grep insert
insert into t10 values(333)
insert into t10 values(666)
insert into t10 values(999)
日志记录sql命令格式:
偏移量:
时间点
[root@host50 mysql]# mysqlbinlog 选项 /logdir/db50.000001
[root@host50 mysql]# mysqlbinlog /logdir/db50.000001
--start-position =数字
--stop-position=数字
--start-datetime="2018-05-03 23:25:15"
--stop-datetime="2018-05-03 23:25:15"
执行日志文件
模拟数据丢失:
mysql> select * from t10;
+------+
| id |
+------+
| 333 |
| 666 |
| 999 |
+------+
3 rows in set (0.00 sec)
mysql> delete from t10 where id in (999,666);
Query OK, 2 rows affected (0.02 sec)
mysql> select * from t10;
+------+
| id |
+------+
| 333 |
+------+
1 row in set (0.00 sec)
查看操作记录的文件:
[root@host50 ~]# mysqlbinlog /logdir/
db50.000012 ——最新的操作记录,记录在数值最大的文件里
[root@host50 ~]# ls /logdir/
db50.000001 db50.000004 db50.000007 db50.000010 db50.index
db50.000002 db50.000005 db50.000008 db50.000011
db50.000003 db50.000006 db50.000009 db50.000012
每次刷新 都会有新的文件产生??
根据日志记录。重新恢复数据
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@host50 ~]# mysqlbinlog --start-position=1095 --stop-position=1194 /logdir/db50.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@host50 ~]# mysqlbinlog --start-position=776 --stop-position=875 /logdir/db50.000001 | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
BEGIN 开始 到COMMIT 结束 ,也可以通过时间进行恢复数据
[root@host50 ~]# mysqlbinlog --start-datetime="2018-07-17 14:12:15" --stop-datetime="2018-07-17 14:21:18" /logdir/db50.000001 | mysql -uroot -p123456
mysql> select * from t10;
+------+
| id |
+------+
| 333 |
| 999 |
| 666 |
+------+
3 rows in set (0.00 sec)
日志记录格式——3种格式
1.statement :记录每一条修改的sql的命令都会记录到binlog日志中。
2.row不记录sql命令的上下文相关信息,只记录那条sql命令被修改过。
3.mixed 是以上两种的结合体。
mysql> show variables like "binlog_format";——查看当前文件记录的格式
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)
[root@host50 ~]# vim /etc/my.cnf ——修改日志记录的格式
[mysqld]
server_id=50
log-bin=/logdir/db50
binlog-format="mixed"
手动生成日志文件
[root@host50 ~]# ls /logdir/
db50.000001 db50.000002 db50.000003 db50.index
——那一个数字大,新产生的记录就会存储的那一个日志文件下,不能一个库指定一个日志文件,记录永远保存数字最大的日志文件
[root@host50 ~]# cat /logdir/db50.index
/logdir/db50.000001
/logdir/db50.000002
/logdir/db50.000003
flush logs;每一次刷新就不会新成成一个新的日志文件记录
mysql> show master status;
——查看当前库的记录日志保存文件
+-------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db50.000003 | 154 | | | |
+-------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
产生新的日志文件的四种方法:
[root@host50 ~]# systemctl restart mysqld
[root@host50 ~]# mysql -uroot -p123456 -e "flush logs"
[root@host50 ~]# mysqldump -uroot -p123456 --flush-logs db3 > /bakdir/db.sql
mysql> flush logs;
如何利用新的日志记录恢复数据:
删除日志文件
命令行删除
rm -rf /logdir/*
sql命令行删除
mysql> purge master logs to "db50.000005";——删除05之前的所有日志文件
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 6
Current database: db3
Query OK, 0 rows affected (0.11 sec)
[root@host50 ~]# ls /logdir/
db50.000005 db50.000006 db50.index
[root@host50 ~]# cat /logdir/db50.index
/logdir/db50.000005
/logdir/db50.000006
mysql> reset master;——删除所有的数据日志文件
Query OK, 0 rows affected (0.12 sec)
[root@host50 ~]# ls /logdir/
db50.000001 db50.index
生产环境使用日志文件恢复数据
可以把日志文件,拷贝到其他数据库中保存下来,用来恢复数据;
DBA 岗位最重要的技术