数据库未整理的笔记(3)

day05数据备份与恢复
一数据备份相关概念
1.1 数据备份的目的?  数据被误删除 或 设备损害导致数据丢失 ,是备份文件恢复数据。
1.2数据备份方式?
物理备份: 指定备份库和表对应的文件   直接拷贝
cp   -r   /var/lib/mysql   /databak/mysql.bak
chown  -R  mysql:mysql   /var/lib/mysql/bbsdb
systemctl  restart  mysqld

51  scp  /opt/mysql.bak   192.168.4.51:/root/
     cp   -r  /root/mysql.bak   /var/lib/mysql
      chown  -R  mysql:mysql   /var/lib/mysql
      systemctl  restart  mysqld
逻辑备份: 在执行备份命令时,根据备份的库表及数据生成对应的sql命令,把sql存储到指定的文件里。
mysqldump备份        mysql恢复
1.3数据备份策略?
完全备份mysqldump备份所有数据(一张表的所有数据一个库的所有数据一台数据库的所有数据)
备份新产生数据(差异备份 和 增量备份  都备份新产生的数据 )
差异备份    备份自完全备份后,所有新产生的数据。
增量备份    备份自上次备份后,所有新产生的数据。
1.4工作中如何对数据做备份?
1.4.1  选择备份策略:
      完全备份+差异备份
      完全备份+增量备份  锁表  备份考虑的问题  数据存储空间  备份文件名
1.4.2  数据备份时间    数据服务器访问量少的时候执行备份
1.4.3  数据备份频率    根据数据产生量,决定备份频率
1.4.4 备份文件的命名   库名-日期.sql
1.4.5 备份文件的存储设置  准备独立的存储设备存储备份文件
1.4.6 如何执行备份  使用周期性计划任务执行本机脚本
完全备份+差异备份
                 06:00      t1    文件名          数据
1   完全                10             1.sql           10
2   差异               3        2.sql           3
3                 5         3.sql           8
4             2             4.sql           12
5             7           5.sql      17
6             4             6.sql      21
7 差异                1             7.sql      22        

完全备份+增量备份mysqldump innobackupex
                06:00      t1    文件名        数据
1   完全              10           1.sql         10
2   增量             3          2.sql         3
3               5            3.sql           5
4           2             4.sql          2
5           7             5.sql          7
6           4          6.sql                4
7  增量            1        7.sql            1  
+++++++++++++++++++++++++++++
二完全备份与完全恢复
2.1 完全备份数据  crond + 备份脚本
]# mkdir  -p /mydatabak
]# mysqldump -uroot -p654321  studb > /mydatabak/studb.sql
]# mysqldump -uroot -p654321  db3 user3 > /mydatabak/db3-user3.sql

]#cat /mydatabak/studb.sql
]#cat  /mydatabak/db3-user3.sql



2.3 完全恢复数据
]# mysql -uroot -p654321  studb  < /mydatabak/studb.sql
]# mysql -uroot -p654321  db3   < /mydatabak/db3-user3.sql
使用source 命令恢复数据
mysql> create database  bbsdb;
mysql> use bbsdb;
mysql> source  /mydatabak/studb.sql
每周一晚上18:00备份studb库的所有数据到本机的/dbbak目录下,备份文件名称要求如下  日期_库名.sql。
]#vim /root/bakstudb.sh
#!/bin/bash
day=`date +%F`
if [ ! -e /dbbak  ];then
     mkdir /dbbak
fi
mysqldump  -uroot  -p654321  studb  >  /dbbak/${day}_studb.sql
:wq

数据完全备份 mysqldump -u -p 数据库名> 目录名/文件名.sql
--all-databases 或 -A(所有库)   数据库名(所有表)     数据库 表名(表记录)
]# chmod   +x   /root/bakstudb.sh
]#/root/bakstudb.sh
]# ls /dbbak/*.sql

]#crontab  -e
00  18   *  *  1        /root/bakstudb.sh  &> /dev/null
00  18   *  *  2-7    /root/newbak.sh 增量
systemctl enable crond
:wq

单独恢复库的数据要先建库名,恢复表是直接可以的
3.1  启动mysql数据库服务的binlog日志文件 实现实时增量备份
3.1.1 binlog日志介绍:是mysql数据库服务日志文件的一种,默认没有启用。记录除查询之外的sql命令。
查询命令例如: select   show   desc  不记录日志的查询内容
写命令例如: insert   update   delete   create  drop

3.1.2 启用binlog日志
]#vim /etc/my.cnf
[mysqld]
server_id=51
log-bin   启用日志默认row  
binlog-format="mixed"
:wq
]# systemctl  restart  mysqld

]# ls /var/lib/mysql/主机名-bin.000001
]# cat  /var/lib/mysql/主机名-bin.index

3.1.3 查看binlog日志文件内容
]#mysqlbinlog   /var/lib/mysql/mysql51-bin.000001

****可以自定义binlog日志文件存储的位置和文件名称
]#mkdir  /mylog
]#chown   mysql   /mylog
]#setenforce  0

]#vim /etc/my.cnf
[mysqld]
server_id=51
#log-bin
log-bin=/mylog/plj     路径 名字 要创建文件
binlog-format="mixed"
:wq

]# systemctl  restart  mysqld
]#ls /mylog/plj.*
plj.000001   plj.index
mysqlbinlong plj.  |grep -i insert





3.1.4 手动生成新的日志文件方法
*默认日志文件大于500M时自动创建新日志文件
]# systemctl  restart mysqld
mysql> flush logs;
]# mysql -uroot -p密码 -e "flush logs"  -e选项简单sql命令 "show databases"
]# mysqldump  -uroot -p密码  --flush-logs  库名  > 目录/xx.sql




增加新的日志
使用一个新的日志文件 记录 新创建的webdb库的初始操作。
mysql> flush  logs;
mysql> create database webdb; create table webdb.a(id int);
mysql> insert into webdb.a values(100);
mysql> insert into webdb.a values(101);
mysql> flush logs;   单独生成库日志命令
删除webdb库,使用 binlog日志文件恢复webdb库的数据。
mysql>  drop   database  webdb;

3.1.7 使用binlog日志恢复数据
]#mysqlbinlog  /mylog/plj.000008   |  mysql  -uroot  -p654321

3.1.5 删除已有的binlog日志文件

mysql> purge  master  logs  to  "binlog文件名;
             删除指定日志文件之前的日志文件
mysql> purge  master  logs  to  "plj.000005";

mysql>  reset master ;  删除所有的日志文件重新生成第一个日志文件
mysql> show master status;  显示当前正在使用的binlog日志信息

]#mysqlbinlog   日志文件名;

3.1.6 binlog日志记录sql命令方式
记录方式有2种:  偏移量   、记录sql命令执行的时间

指定偏移量范围选项
--start-position=偏移量的值  
--stop-position=偏移量的值

指定时间范围选项
--start-datetime="yyyy-mm-dd  hh:mm:ss"  
--stop-position="yyyy-mm-dd  hh:mm:ss"
 ++++++++++++++++++++++++
读取日志文件指定范围内的sql命令恢复数据。
]# mysqlbinlog  --start-position=293  --stop-position=1450   plj.000001   |  mysql  -uroot  -

p654321
++++++++++++++++++++++++++++

]#mysqldump  -uroot  -p654321  --flush-logs  db3.user3  >  /root/user3.sql

mysql> insert into db3.user3 values("a","b","c");
mysql> insert into db3.user3 values("aa","b","c");
mysql> insert into db3.user3 values("ab","b","c");
mysql> insert into db3.user3 values("ac","b","c");

mysql> delete from  db3.users;
mysql> select  * from  db3.user3;

]#mysql  -uroot  -p654321  db3  <  /root/user3.sql
mysql> select  * from  db3.user3;

]#mysqlbinlog    --start-position=偏移量的值  
--stop-position=偏移量的值  日志文件名 |  mysql  -uroot  -p654321

mysql> select  * from  db3.user3;
+++++++++++++++++++++++++++++++++
3.2  安装第3方软件提供备份命令,对数据做增量备份
软件介绍 Percona 开源软件  在线热备不锁表  适用于生成环境。
婆堪呢
安装软件
]# rpm -ivh  libev-4.15-1.el6.rf.x86_64.rpm
]# yum -y  install   perl-DBD-mysql   perl-Digest-MD5
]# rpm  -ivh  percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
]# rpm  -ql  percona-xtrabackup-24

提供2个备份命令man innobackupexqsys
/usr/bin/innobackupex命令集成了命令xtrabackup,所以可以支持MYISAM存储引擎

/usr/bin/xtrabackup命令仅支持InnoDB和XtraDB存储引擎的表

innobackupex备份命令的使用格式?
]#innobackupex  <选项>
]# man  innobackupex
mysql  用户密码
performance_schema视图
sys 系统

常用选项?
--user  用户名
--password  密码
--databases="库名"     
                     "库名1  库名2"
                     "库名.表名"
--no-timestamp  不使用时间戳做备份文件的子目录名

+++++++++++++++innobackupex完全备份 与 完全恢复
]# innobackupex  --user  root   --password   654321  \
--databases="mysql   performance_schema  sys   gamedb"   /allbak  --no-timestamp

++++++++++++++完全恢复   
--copy-back

]# rm   -rf  /var/lib/mysql
]# mkdir  /var/lib/mysql
]# innobackupex  --user root --password 654321  --copy-back  /allbak
]# chown  -R  mysql:mysql  /var/lib/mysql
]#  systemctl  restart  mysqld
]#mysql   -uroot  -p654321
mysql> show  databases;
mysql> select  * from  gmaedb.t1;

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
事务日志文件cat xtrabackup_checkpoints
LSN    日志序列号
ibdata1
xtrabackup_logfile
 innobackupex  --user   root   --password  123456--databases="  mysql  performance_schema  sys db"   --apply-log  /allbak  --no-timestamp


--apply-log 回滚日志
--copy-back拷贝
清空目录
chown -R mysql:mysql /var/lib/mysql
重起
增量备份的工作过程?
每一个备份目录下,都有记录当前目录备份信息的配置文件
]# cat   备份目录名/xtrabackup_checkpoints   (记录备份类型 和lsn范围)


+++++++++innobackupex增量备份与恢复
--incremental  目录名                   #增量备份
--incremental-basedir=目录名    #增量备份时,指定上一次备份文件存储的目录名

innobackupex  --user   root   --password  123456    --databases="  mysql  performance_schema  sys "  --incremental    /new1dir --incremental-basedir=/allbak --no-timestamp
先要有一次完全备份  存放目录 /fullbak
]# innobackupex  --user   root   --password  654321   \
--databases="gamedb  mysql  performance_schema  sys"  \
/fullbak  --no-timestamp

插入新记录,执行增量备份    存放目录 /new1bak
mysql> insert  into  gamedb.t1  values(8080),(8080);
]# innobackupex  --user   root   --password  654321   \
--databases="gamedb  mysql  performance_schema  sys"  \
--incremental    /new1dir    --incremental-basedir=/fullbak     --no-timestamp


插入新记录,执行增量备份    存放目录 /new2bak
]# innobackupex  --user   root   --password
--databases="mysql  performance_schema  sys"
--incremental   /new2dir   --incremental-basedir=/new1dir   --no-timestamp


++++++++++++++增量恢复
--apply-log   准备恢复数据
--redo-only  合并日志
--incremental-dir=目录名   #增量恢复数据时,指定备份目录名称
--copy-back 恢复数据

清空数据库目录
]# rm   -rf   /var/lib/mysql
]# mkdir   /var/lib/mysql
准备恢复数据
]# innobackupex  --user   root   --password  
--databases=  "mysql  performance_schema  sys"  
--apply-log        /fullbak

合并日志
]# innobackupex  --user   root   --password  654321   \
--databases="gamedb  mysql  performance_schema  sys"  \
--apply-log    --redo-only    /fullbak   --incremental-dir=/new1dir                      

]# innobackupex  --user   root   --password  654321   \
--databases="gamedb  mysql  performance_schema  sys"  \
--apply-log    --redo-only    /fullbak   --incremental-dir=/new2dir


拷贝备份文件到数据库目录
]# innobackupex  --user   root   --password  654321   \
--databases="gamedb  mysql  performance_schema  sys"  \
--copy-back   /fullbak
]# ls  /var/lib/mysql   -l

修改文件的所有者/组mysql
]# chown  -R  mysql:mysql  /var/lib/mysql


重启数据库服务
]# systemctl   restart  mysqld
]# mysql   -uroot   -p654321


+++++++++++++++++++++使用完全备份文件恢复单个表
--export  导出表信息
mysql> alter  table  库.表   discard  tablespace;   删除表空间
mysql> alter  table  库.表  import  tablespace;  导入表空间

1完全备份
]#  innobackupex   --user   root    --password   654321   \
--databases="studb"    /allbakstudb    --no-timestamp

2查看备份目录文件列表

system  在数据库打命令
]# ls   /allbakstudb
]# ls   /allbakstudb/studb

3误删除a表:    mysql>  drop   table   studb.a;

4 使用完全备份文件恢复单个表
4.1  按照备份时的表结构创建删除的表
create   table  studb.a(name char(10));

4.2  删除创建表的表空间文件
mysql> alter  table studb.a  discard  tablespace;

4.3  使用备份文件导出表信息
]#innobackupex --user root --password 654321   \
--databases="studb"  --apply-log   --export   /allbakstudb

4.4  把导出的表信息文件,拷贝到对应的数据库目录下,并修改所有者和组为mysql
]# cp /allbakstudb/studb/a.{cfg,exp,ibd}   /var/lib/mysql/studb/
]# chown mysql:mysql /var/lib/mysql/studb/a.*

4.5  导入表空间
mysql>  alter  table  studb.a  import  tablespace;

[root@mysql51 ~]# rm  -rf /var/lib/mysql/studb/a.cfg
[root@mysql51 ~]# rm  -rf /var/lib/mysql/studb/a.exp

4.6  查看记录
mysql> select   * from  studb.a;


2.3 配置mysql主从同步
启用binlog日志 做用户授权    show master status;
指定server_id  指定主数据库服务器的信息  启动slave进程
公共配置ping通

2.3.1 配置主库 (192.168.4.51)master     slave
show master status;
a 做用户授权
grant  replication  slave  on  *.*   to  yaya@"%" identified by "123456";

b 启用binlog日志
vim  /etc/my.cnf
[mysqld]
server_id=51
log-bin=master51
binlog-format="mixed"
:wq
]# systemctl  restart   mysqld

]# ls /var/lib/mysql/master51.*
/var/lib/mysql/master51.000001  /var/lib/mysql/master51.index

c 查看正在使用binlog日志信息
]#mysql  -uroot   -p123456
mysql> show  master  status;

2.3.2  配置从库
a 验证主库的用户授权
]# mysql -h192.168.4.51 -urepluser -p123456
mysql>  show   grants;
mysql>  quit;

b 指定server_id
]# vim  /etc/my.cnf
[mysqld]
server_id=52
:wq
]# systemctl  restart mysqld
c数据库管理员本机登录,指定主数据库服务器的信息
]#mysql  -uroot   -p123456
change  master  to
master_host="192.168.4.62",
master_user="abc",
master_password="123456",
master_log_file="master62.000001",
master_log_pos=154;
d 启动slave进程
mysql> start slave;

e查看进程状态信息
mysql> show slave status\G;
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
stop slave

host62-relay-bin.*
host62-relay-bin.index
master.info
relay-log.info

show  processlist;进程列表



2.4 在客户端测试主从同步配置
2.4.1  在主库服务器上添加访问数据时,使用连接用户
]# mysql  -uroot  -p123456
mysql> grant all  on bbsdb.*  to  webadmin@"%"  identified  by "123456";
mysql>select user,host from  mysql.user where  user="webadmin";
mysql> quit;

2.4.2  客户端使用主库的授权用户,连接主库服务器,建库表插入记录
254]# mysql   -h192.168.4.51  -uwebadmin  -p123456
mysql> 建库  建表 插入记录

2.4.3  在从库本机,使用管理登录查看是否有和主库一样库表记录及授权用户
52]# mysql   -uroot  -p123456
mysql> select  * from  库.表;

2.4.4 客户端使用主库的授权用户,连接从库服务器,也可以看到新建的库表及记录
254]# mysql   -h192.168.4.52  -uwebadmin  -p123456
mysql> select  * from  库.表;

+++++++++++配置mysql主从从结构
主库  192.168.4.51
从库  192.168.4.52 ( 做51主机从库)
从库  192.168.4.53 ( 做53主机从库)
要求:客户端访问主库51 时 创建库表记录 在52 和53 数据库服务器都可以看到

配置步骤:
一、环境准备
主从同步未配置之前,要保证从库上要有主库上的数据。
禁用selinux    ]#  setenforce  0
关闭防火墙服务]# systemctl  stop firewalld
物理连接正常 ]#  ping   -c   2   192.168.4.51/52
数据库正常运行,管理可以从本机登录

二、配置主从同步
2.1 配置主库51
2.1.1  用户授权
]#mysql -uroot  -p123456
mysql> grant   replication  slave   on  *.*  to  yaya@"%"   identified    by  "123456";
2.1.2 启用binlog日志
vim /etc/my.cnf
server_id=51
log-bin=db51
binlog-format="mixed"
:wq
]#  systemctl  restart   mysqld
[root@db51 ~]# ls  /var/lib/mysql/db51.*
/var/lib/mysql/db51.000001    /var/lib/mysql/db51.index
2.1.3 查看正在使用的日志信息
]#mysql -uroot  -p123456
mysql> show  master  status;
+-------------+----------+--------------+------------------+-------------------+
| File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db51.000001 |      154 |              |                  |                   |
+-------------+----------+--------------+------------------+-------------------+

2.2 配置从库52
用户授权
]#mysql  -uroot  -p123456
mysql>  grant   replication  slave  on  *.*  to   yaya@"%"  identified  by "123456";

启用binlog日志,指定server_id  和 允许级联复制
]# vim  /etc/my.cnf
[mysqld]
server_id=52
log-bin=db52
binlog-format="mixed"
log_slave_updates
:wq
]# systemctl  restart  mysqld
[root@db52 ~]# ls /var/lib/mysql/db52.*
查看正在使用的日志信息
]#mysql  -uroot  -p123456
mysql> show master status;
+-------------+----------+--------------+------------------+-------------------+
| File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db52.000001 |      154 |              |                  |                   |             |    
+-------------+----------+--------------+------------------+-------------------+
binlog_do_db=name
binlog_ignore_db=name


log_slave_updates
relay_log=dbsvr2-relay-bin
replicate_do_db=mysql
replicate_ignore_db=test



验证主库的授权用户
]# mysql   -h192.168.4.51  -uyaya   -p123456
mysql> quit;

管理员登录指定主库信息
~]# mysql -uroot  -p123456
 change  master  to
 master_host="192.168.4.62",
 master_user="yaya",
 master_password="123456",
 master_log_file="master62.000006",
 master_log_pos=154;
启动slave进程
mysql> start slave;

查看进程状态信息
mysql>  show  slave status \G;
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
2.3  配置从库53
2.3.1验证主库的授权用户
]#mysql  -h192.168.4.52  -uuser53  -p654321
mysql> quit;
2.3.2 指定server_id
]# vim /etc/my.cnf
[mysqld]
server_id=53
:wq
]# systemctl  restart  mysqld
2.3.3 管理员登录指定主库信息
change  master  to
master_host="192.168.4.63",
master_user="yaya",
master_password="123456",
master_log_file="db63.000001",
master_log_pos=154;
2.3.4 启动slave进程
mysql> start  slave;
2.3.5 查看进程状态信息
mysql> show slave status\G;
      Slave_IO_Running: Yes
      Slave_SQL_Running: Yes

三、客户端验证配置
3.1 在主库上授权访问gamedb库的用户
mysql>  grant  all  on  gamedb.*   to   dada@"%"  identified by  "123456";

3.2 客户端使用授权用户连接主库,建库、表、插入记录
]# mysql  -h192.168.4.51  -udada  -p123456
create  database  gamedb;

create  table  gamedb.t1(id int);
insert into  gamedb.t1 values(8888);

create  table  gamedb.t2(id int);
insert into  gamedb.t2 values(99999);

select  * from gamedb.t1;select  * from gamedb.t2;


3.3 客户端使用授权用户连接2台从库时,也可以看到主库上新的库表记录
]# mysql  -h192.168.4.52  -udada  -p123456
select  * from gamedb.t1;select  * from gamedb.t2;

]# mysql  -h192.168.4.53  -udada  -p123456
select  * from gamedb.t1;select  * from gamedb.t2;


show variables like  "have_dynamic_loading";
show  variables  like  "rpl_semi_sync_ %_enabled";
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

SELECT  PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
INSTALL PLUGIN rpl_semi_sync_master SONAME  'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';


plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1










plugin-load = "rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so“

rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1










猜你喜欢

转载自blog.csdn.net/weixin_40447206/article/details/81051504