mysql备份数据库 怎么锁表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql备份数据库 怎么锁表相关的知识,希望对你有一定的参考价值。

mysql8.x 中新增了一个轻量级的备份锁,它允许在 online 备份的时候进行 DML 操作,同时可防止快照不一致。这个锁禁止的操作很少,它禁止的操作包括:

    文件的创建、删除、改名账户的管理REPAIR TABLETRUNCATE TABLEOPTIMIZE TABLE备份锁由 lock instance for backup 和 unlock instance 语法组成。使用这些语句需要 BACKUP_ADMIN 权限。
参考技术A mysqldump是mysql用于转存储数据库的实用程序。它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE
TABLE INSERT等。如果给mysqldump进行备份,从库上停止复制的sql线程
然后mysqldump,这个是个很好的选择,因为停止复制就没有写,就不用担心锁表的问题 。下面提供两只备份方法:

一、MyISAM引擎备份
1. 由于MyISAM引擎为表级锁,因此,在备份时需要防止在备份期间数据写入而导致不一致,
2. 所以,在备份时使用--lock-all-tables加上读锁

mysqldump -A -F -B --lock-all-tables |gzip >/data/backup/$(date +%F).tar.gz
3. 特别提示:有关MyISAM和InnoDB引擎的差别和在工作中如何选择,在前面已经详细讲解过了,这里就不在讲了。

二、 InnoDB引擎备份
1. InnoDB引擎为行锁,因此,备份时可以不对数据库加锁的操作,可以加选项--single-transaction进行备份:
mysqldump -A -F -B --single-transaction |gzip >/data/backup/$(date +%F).tar.gz

2. 特别注意:
--single-transaction仅适用于InnoDB引擎。

--master-data=2
会将当前mysql用到的binlog文件的日志名称和位置记录下来 然后搜索change master就行了
mysqldump -uroot -p'passwd' -B ctp1 --lock-all-tables|gzip >/home/mysql/ctp1.$(date +%F).tar.gz
--no--data 仅仅dump数据库结构创建脚本 通过--no-create-info 去掉dump文件中创建表结构的命令。本回答被提问者和网友采纳
参考技术B 备份抽取的时候会自动锁表的,你不需要手动锁住

MySQL主从复制原理深入讲解

利用MySQL自身提供的主从复制技术,在企业生产场景中,可以很好的对数数据进行多处自动备份,并且实现数据库的扩展。比如:在做定时备份时,备份的过程可能需要锁表操作,在备份锁表期间,用户无法访问数据,虽然可以选择在业务低谷期进行备份,但是多少都会有影响,这时可以通过主从复制的从库进行锁表备份。在主从复制的基础上通过读写分离技术还能提升数据库的负载性能(主库写,从库读)。
主从复制模型

一主一从
一主多从
双主
线性级联
环状级联
这次用来讲解的是一主一从模型
主从复制原理图
技术分享图片

主从复制过程存在三个线程,Master端的I/O线程,Slave的I/O线程与SQL线程。Master端需要开启binlog日志,Slave端需要开启relay日志。
1、Slave端的I/O读取master.info文件,获取binlog文件名和位置点,然后向Master端的I/O线程请求,该binlog文件名和位置点的binlog信息。
(master.info文件在配置主从复制时使用change master命令来指定生成)
2、Master端的I/O线程会根据Slave端的I/O线程请求的信息来读取Master的binlog日志信息与及读取到最新的binlog文件名和位置点一同返回给Slave的I/O线程。
3、Slave端的I/O线程会把获取到的binlog日志写入relay日志(中继日志)文件中,并且更新master.info文件信息。(把读取到Master最新的binlog日志文件名和位置点更新到master.info文件中,下一次当前位置去读取Master的binlog日志)
4、Slave端的SQL线程会定期读取relay日志,把二进制的日志解析成SQL语句,并执行这些SQL语句,同步数据到从库中。
主从复制实战配置

配置小结
Master端
1、同步Master端的原始数据到所有Slave端
2、开启binlog日志,保持server-id唯一
3、配置Slave验证授权用户,权限replication slave
Slave端
1、执行change master语句,生成master.info文件
2、开启relay日志,保持server-id唯一
3、启动Slave复制(start slave)

Master端全备数据库同步到Slave端
在开始做主从复制之前,需要把Master原有的数据都先同步到所有的Slave,否则在做同步复制之时,因为原有数据不一致导致同步失败。(注意,如果使用原来备份时间点比如昨天凌晨的全备数据同步所有Slave数据时,还需要把当前时间点之前的所有binlog增量备份同步,使在截取主从复制时间点时,Master和所有Slave的数据保持一致)

原有数据不一致导致主从复制失败

mysql> show slave statusG
Last_Error: Error ‘Table ‘ricky.test‘ doesn‘t exist‘ on query. Default database: ‘ricky‘. Query: ‘insert into test values(987654,9,‘gogo‘,30)‘

并且全备时,要锁表备份,并导入所有Slave,保证截取的时间点数据一致,同时刷新binlog日志。

[[email protected] ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B -R --flush-logs --lock-all-tables --events >/tmp/mysql_bak_$(date +%F).sql
[[email protected] ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock </tmp/mysql_bak_2018-07-12.sql
[[email protected] ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock
mysql> show databases;

Master端配置

Master端开启binlog日志功能

[[email protected] ~]# egrep "log-bin|server-id" /data/3306/my.cnf 
log-bin = /data/3306/mysql-bin
server-id = 1

Master配置slave复制授权用户

#权限replication slave
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘mysql52‘@‘172.16.1.52‘ IDENTIFIED BY ‘123456‘;
mysql> flush privileges;

检查Master端当前binlog日志文件名和位置点
当前binlog文件名和位置点,在配置Slave端时,需要告诉Slave端

mysql> show master statusG
*************************** 1. row ***************************
            File: mysql-bin.000004
        Position: 337
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

Slave端配置

Slave端开启relaylog日志功能

[[email protected] ~]# egrep "relay-bin|server-id" /data/3307/my.cnf       
relay-log = /data/3307/relay-bin
server-id = 3

告诉Slave端主从复制时连接的Master(ip+端口【默认可以不需要】)、授权连接用户和密码、binlog文件名和位置点。这里的binlog文件名和位置点还有另一种解决办法,在mysqldump全备时加入--master-data参数,把change master【1,不注释;2,注释】语句嵌入到备份文件中(mysqldump逻辑备份,以SQL语句形式导出数据),把备份文件复制到Slave端导入时,如果参数选项为“1”,则会自动执行change master语句,把binlog文件名和位置点写入Slave端的master.info文件中。其它的master端信息、授权用户和密码则需要手动change master写入master.info文件。

执行change master语句

mysql> CHANGE MASTER TO MASTER_HOST=‘172.16.1.52‘,  
    -> MASTER_PORT=3306,
    -> MASTER_USER=‘mysql52‘,
    -> MASTER_PASSWORD=‘123456‘,
    -> MASTER_LOG_FILE=‘mysql-bin.000004‘,
    -> MASTER_LOG_POS=337;

启动Slave

mysql> start slave;

查看Slave端状态

mysql> show slave statusG
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.52
                  Master_User: mysql52
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 337
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 337
              Relay_Log_Space: 403
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)

测试主从复制功能
Master端向test表中插入一条数据

mysql> insert into test values(987654,9,‘gogo‘,30);

Slave端对应的test会同步了该条数据

mysql> select * from ricky.test;

以上是关于mysql备份数据库 怎么锁表的主要内容,如果未能解决你的问题,请参考以下文章

企业生产环境数据库备份锁表问题

mysql 不停机 短时间锁表 备份 主备同步 新增备份机器

mysqldump 如何备份 以及如何解决锁表的问题

MySQL数据库备份命令mysqldump参数详解

MySQL主从复制原理深入讲解

MySQL 进阶 锁 -- MySQL锁概述MySQL锁的分类:全局锁(数据备份)表级锁(表共享读锁表独占写锁元数据锁意向锁)行级锁(行锁间隙锁临键锁)