Linux初学者学习笔记

20171112 MySQL进阶(二)

2017-11-16  本文已影响14人  哈喽别样
  • 日志
  • 备份和恢复
  • MySQL Replication 复制

一、日志:

(一)查询日志:记录查询语句,一般不开启

(二)慢查询日志:运行时间超出指定时长的查询

(三)错误日志

(四)二进制日志

(1)基本概念
(2)相关变量
(3)mysqlbinlog
(4)二进制日志事件格式:

二进制日志截取片段如下:

# at 553
#160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1472608568/*!*/;
BEGIN
/*!*/;

事件的起始位置:# at 553
事件发生的日期时间:#160831 9:56:08
事件发生的服务器id:server id 1
事件的结束位置:end_log_pos 624
事件的类型:Query
事件发生时所在服务器执行此事件的线程的ID: thread_id=2
语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0
错误代码:error_code=0
设定事件发生时的时间戳:SET TIMESTAMP=1472608568/*!*/;
事件内容:BEGIN

(5)实验1:二进制日志的相关操作

(五)中继日志:

从服务器上记录下来从主服务器的二进制日志文件同步过来的事件

(六)事务日志:

事务型存储引擎innodb用于保证事务特性的日志文件

二、备份和恢复:

备份:存储的数据副本,需要注意主机备份过程中原始数据可能持续发生改变
恢复:把副本应用到线上系统,需要注意仅能恢复至备份操作时刻的数据状态
时间点恢复:通过二进制日志binary logs恢复备份过程中发生改变的数据

(一)为什么备份?

(二)备份时应该注意事项:

(三)备份类型:

(四)备份策略:

(五)备份内容:

(六)备份工具:

(1)mysqldump
(2)cp/tar
(3)Innobackup/xtrabackup

(七)mysqldump备份工具的使用:

(1)备份机制:逻辑备份,即备份内容为SQL脚本
(2)具体使用语法:
(3)实验:使用mysqldump实现“完全+binlog”方式的备份与还原操作
mysqlbinlog master-log.000007 > /tmp/binlog.sql
scp /tmp/binlog.sql 192.168.136.130:/root

(八)Xtrabackup备份工具的使用

(1)Xtrabackup备份采用物理备份:
(2)具体使用语法:
(3)实验:使用xtrabackup实现“完全+增量+binlog ”方式的备份与还原操作
mkdir -pv /mydata/backups
innobackupex --user=root --password=centos --host=localhost /mydata/backups/
ls -l /mydata/backups      // 查看目录下以时间命名的备份目录
MariaDB [(none)]> INSERT INTO students (NAME,AGE,GENDER) VALUES ('Philip',17,'M')
innobackupex --user=root --password=centos --host=localhost --incremental /mydata/backups/ --incremental-basedir=/mydata/backups/2017-11-14_14-22-51/
MariaDB [(none)]> INSERT INTO students (NAME,AGE,GENDER) VALUES ,('Nancy',19,'F');
innobackupex --user=root --password=centos --host=localhost --incremental /mydata/backups/ --incremental-basedir=/mydata/backups/2017-11-14_14-30-19/
MariaDB [(none)]> UPDATE students SET DESP='physical' WHERE AGE>22;
// 查询最后一次增量备份后二进制日志事件位置
cat /mydata/backups/2017-11-14_14-37-45/xtrabackup_binlog_info
// 将之后的日志导出
mysqlbinlog -j 1026 /mydata/logs/master-log.000007 > /root/mybinlog.sql
// 依次将增量备份合并至全量备份上
innobackupex --apply-log --redo-only /mydata/backups/2017-11-14_14-22-51/
innobackupex --apply-log --redo-only /mydata/backups/2017-11-14_14-22-51/ --incremental-dir=/mydata/backups/2017-11-14_14-30-19/
innobackupex --apply-log --redo-only /mydata/backups/2017-11-14_14-22-51/ --incremental-dir=/mydata/backups/2017-11-14_14-37-45
// 最后对合并后的全量备份做整理准备
innobackupex --apply-log /mydata/backups/2017-11-14_14-22-51/
scp -r /mydata/backups/2017-11-14_14-22-51/ 192.168.136.130:/root
scp /root/mybinlog.sql 192.168.136.130:/root
innobackupex --copy-back /root/2017-11-14_14-22-51/
ls -l /var/lib/mysql/     // 查看备份还原情况
chown -R mysql.mysql /var/lib/mysql/*
systemctl start mariadb

此时恢复至最后一次增量备份时的状态

方法1:一次导入SQL脚本

SET @@session.sql_log_bin=OFF;
mysql -uroot -pcentos < /root/mybinlog.sql
SET @@session.sql_log_bin=ON;

方法2:在mysql环境下执行SQL脚本

SET @@session.sql_log_bin=OFF;
mv /root/mybinlog.sql /tmp/
mysql -uroot -pcentos
MariaDB [(none)]> \. /tmp/mybinlog.sql
SET @@session.sql_log_bin=ON;

此时全部恢复完成

mkdir -pv /mydata/backups
innobackupex --user=root --password=centos --host=localhost /mydata/backups/

三、MySQL Replication 复制:

(一)主从(MASTER/SLAVE)架构

(二)主从架构的分类

(三)MySQL主从复制的实现

ntpdate 172.18.0.1                // 时间同步
vim /etc/my.cnf.d/server.cnf      //[server]段落下添加如下两行
log_bin = master-log
server_id = 1
systemctl start mariadb
// mysql登录
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.136.%'' IDENTIFIED BY 'centos'    // 给从服务器的账号授权允许复制
MariaDB [(none)]> FLUSH PRIVILEGES;
SHOW MASTER STATUS;              // 查看当前二进制日志所在位置
ntpdate 172.18.0.1                // 时间同步
vim /etc/my.cnf.d/server.cnf 
relay_log = relay-log
server_id = 2                     // 独一无二,不能与主服务器和其他从服务器相同
systemctl start mariadb
// mysql登录
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.136.230',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=497;
MariaDB [(none)]> START SLAVE IO_THREAD,SQL_THREAD;     // 开启复制
MariaDB [(none)]> SHOW SLAVE STATUS\G                   // 查看当前从服务器状态

红框1:主服务器的地址,用户;
红框2:从服务器获取的主服务器二进制日志和所在位置;
红框3:从服务器IO和SQL线程的开启状态

MariaDB [(none)]> CREATE DATABASE mydb;
MariaDB [(none)]> USE mydb;
CREATE TABLE students (ID INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,NAME CHAR(20) NOT NULL,AGE TINYINT NOT NULL, GENDER ENUM('M','F'),DESP VARCHAR(50));
INSERT INTO students (NAME,AGE,GENDER) VALUE ('Alice',20,'F'),('Bob',22,'M');
SELECT * FROM students;

可以看到当前主服务器的二进制日志位置已经前进至1054

登录从服务器,检查数据库同步成功

MariaDB [(none)]> SHOW DATABASES;
USE mydb;
MariaDB [mydb]> SELECT * FROM students;

查看从服务器的状态信息

MariaDB [mydb]> SHOW SLAVE STATUS\G

可以看到从服务器上显示的主服务器二进制文件和位置信息跟随主服务器进行了同步

(四)MySQL主主复制的实现

vim /etc/my.cnf.d/server.cnf
server_id = 1
log_bin = master-log
relay_log = relay-log
auto_increment_offset = 1
auto_increment_increment = 2
systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.136.%' IDENTIFIED BY 'centos';
MariaDB [(none)]> SHOW MASTER STATUS;

记录此时节点1二进制日志文件和位置

vim /etc/my.cnf.d/server.cnf 
server_id = 2
log_bin = master-log
relay_log = relay-log
auto_increment_offset = 2
auto_increment_increment = 2
systemctl start mariadb
MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.136.%' IDENTIFIED BY 'centos';
MariaDB [(none)]> SHOW MASTER STATUS;

记录此时节点1二进制日志文件和位置

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.136.130',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=428;
MariaDB [(none)]> START SLAVE IO_THREAD,SQL_THREAD;
MariaDB [(none)]> SHOW SLAVE STATUS\G
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.136.230',MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_LOG_FILE='master-log.000004',MASTER_LOG_POS=428;
MariaDB [(none)]> START SLAVE IO_THREAD,SQL_THREAD;
MariaDB [(none)]> SHOW SLAVE STATUS\G
MariaDB [(none)]> USE mydb;
MariaDB [mydb]> SELECT * FROM students;
MariaDB [mydb]> INSERT INTO students (NAME,AGE,GENDER) VALUES ('John',19,'M'),('Penny',23,'F');
MariaDB [mydb]> SELECT * FROM students;
MariaDB [(none)]> USE mydb;
MariaDB [mydb]> INSERT INTO students (NAME,AGE,GENDER) VALUES ('James',25,'M'),('Marry',24,'F');
MariaDB [mydb]> SELECT * FROM students;
上一篇 下一篇

猜你喜欢

热点阅读