# yum -y install autoconf libaio libaio-devel
# vim /data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
tmpdir = /tmp
open_files_limit = 65535
character-set-server = utf8mb4
back_log = 500
max_connections = 3000
max_connect_errors = 10000
#table_cache = 6144
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 64M
query_cache_type = 1
#default_table_type = InnoDB
#transaction_isolation = READ-COMMITTED
tmp_table_size = 512M
max_heap_table_size = 256M
table_open_cache = 512
log_error=/data/3306/mysql_3306.err
slow_query_log_file = /data/3306/mysql-slow.log
slow_query_log = 1
long_query_time =0.5
pid-file = /data/3306/mysql.pid
log-bin = /data/3306/mysql-bin
relay-log = /data/3306/relay-bin
relay-log-info-file = /data/3306/relay-log.info
binlog_cache_size = 2M
binlog_format = row
log-slave-updates
max_binlog_cache_size = 4M
max_binlog_size = 256M
expire_logs_days = 7
#myisam_sort_buffer_size = 1M
#myisam_max_sort_file_size = 10G
#myisam_max_extra_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
skip-name-resolve
skip-host-cache
replicate-ignore-db = mysql
server-id = 71
innodb_additional_mem_pool_size = 8M
innodb_buffer_pool_size = 16G #设置成内存的60-70%最好
innodb_data_file_path = ibdata1:128M;ibdata2:128M:autoextend
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 4M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_file_per_table = 1
[mysqldump]
quick
max_allowed_packet = 8M
# chown mysql.mysql -R /data/3306/
--defaults-file=/data/3306/my.cnf \
--basedir=/usr/local/mysql/ \
--datadir=/data/3306/data/ --user=mysql
#添加环境变量
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf &
mysqladmin -uroot password Root123 -S /data/3306/mysql.sock
#!/bin/sh
port=3306
mysql_user="root"
mysql_pwd="Root123"
cmdpath="/usr/local/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#start function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
echo "starting mysql…"
/bin/sh ${cmdpath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /devull &
else
echo "mysql is running…"
exit
fi
}
#stop function
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
echo "mysql is stopped…"
else
echo "stoping mysql…"
${cmdpath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
#restart function
function_restart_mysql()
{
echo "restarting mysql…"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
echo "usage: /data/${port}/mysql {start|stop|restart}"
esac
MySQL冷备:mysqldump,热备:xtrabakackup有2个工具,分别是xtrabakup、innobakupe,支持MySQL、Percona server和MariaDB。
xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
1 备份速度快,物理备份可靠
2 备份过程不会打断正在执行的事务(无需锁表)
3 能够基于压缩等功能节约磁盘空间和流量
4 自动备份校验
5 还原速度快
6 可以流传将备份传输到另外一台机器上
7 在不增加服务器负载的情况备份数据
Xtrabackup备份流程图:
1 innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
2 xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
3 xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
4 innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
5 当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
6 xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
7 innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
8 最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
1) xtrabackup的yum安装
1、yum安装
下载地址:https://www.percona.com/downloads/XtraBackup/LATEST/
# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
2) xtrabackup的二进制安装
这种安装方法也很简单,不象rpm包需要安装依赖包,只需解压安装文件,为了方便可创建软连接。
1、检查libgcrypt的版本:
2、下载XtraBackup
3、解压缩文件
1、参数选项
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host #指定主机
--user #指定用户名
--password #指定密码
--port #指定端口
--databases #指定数据库
--incremental #创建增量备份
--incremental-basedir #指定包含完全备份的目录
--incremental-dir #指定包含增量备份的目录
--apply-log #对备份进行预处理操作(备份后的数据,含有未提交的事务,通过回滚,保证数据一致性)
--redo-only #不回滚未提交事务
--copy-back #恢复备份目录
--no-timestamp #不创建以时间命名的目录(默认以时间命名)
2、innobackupex文件介绍
使用innobackupex备份时,会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、
以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件
1)xtrabackup_checkpoints
备份类型(完全或增量)、备份状态(是否已为prepared状态)和LSN(日志序列号)范围信息
每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号
2)xtrabackup_binlog_info
二进制日志文件及位置点
3)xtrabackup_binlog_pos_innodb
二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position
4)xtrabackup_binary
备份中用到的xtrabackup的可执行文件
5)backup-my.cnf
备份命令用到的配置选项信息
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
备份:
恢复:
备份到远程
注意:解压时tar +i参数, tar -xizf all.tar.gz
1) 全量备份
# ll 2018-07-30_11-01-37/
-rw-r----- 1 root root 418 Jul 30 11:01 backup-my.cnf #备份用到的配置选项信息文件
-rw-r----- 1 root root 79691776 Jul 30 11:01 ibdata1 #数据文件
-rw-r----- 1 root root 21 Jul 30 11:01 xtrabackup_binlog_info #mysql服务器当前正在使用的二进制日志文件及位置点
-rw-r----- 1 root root 113 Jul 30 11:01 xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root 482 Jul 30 11:01 xtrabackup_info
-rw-r----- 1 root root 2560 Jul 30 11:01 xtrabackup_logfile #备份的日志文件
2) 恢复
# chown -R mysql.mysql /usr/local/mysql/data/ # /etc/init.d/mysqld start # mysql -uroot -p -e "show databases;"
注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录,且不能重新初始化
1、增量备份(基于全量备份)
2、合并全备数据
3、合并增量数据
4、 恢复
5、备注:
1) 2018-07-30_11-01-37 是全备的目录。
2) 2018-07-30_13-51-47 是增量备份的目录,如果有多次增量备份,每一次都要执行如上操作
1、全备
2、增量备份
3、查看文件
drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37 #全量备份数据目录
drwxr-x--- 8 root root 273 Jul 30 13:51 2018-07-30_13-51-47 #增量备份数据目录
backup_type = full-backuped #备份类型为全量备份
from_lsn = 0 #lsn从0开始
to_lsn = 3127097 #lsn到3127097结束
last_lsn = 3127097
backup_type = incremental #备份类型为增量备份
from_lsn = 3127097 #lsn从3127097开始
to_lsn = 3158741 #lsn到啊3158741结束
last_lsn = 3158741
4、模拟故障,删除数据目录所有数据
5、合并全备
6、合并增量,确保数据的一致性
backup_type = log-applied #查看到数据备份类型是增加
from_lsn = 0
to_lsn = 3158741
last_lsn = 3158741
7、恢复数据
1、查看主机名和ip地址
db01
10.0.0.51 172.16.1.51
db02
10.0.0.52 172.16.1.52
db01: 主库,db02: 从库,从库无数据,server id不能相同,主库开启binlog
2、安装xtrabackup
#两台服务器均安装以下软件包。
3、创建测试环境
mysql> create database oldboy;
mysql> use oldboy
mysql> drop table test;
mysql> CREATE TABLE test (
id int(4) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
PRIMARY KEY (id)
) ;
mysql> insert into test(id,name) values(1,'oldboy');
mysql> insert into test(name) values('oldgirl');
mysql> insert into test values(3,'inca');
mysql> insert into test values(4,'zuma'),(5,'kaka');
1) 在db01上做一次全备
#把全备复制到db02
备份完后,生产环境会有继续写人数据库,插入数据模拟环境
mysql> use oldboy;
mysql> insert into test(id,name) values(6,'bing');
mysql> insert into test(id,name) values(7,'zhao');
mysql> insert into test(id,name) values(8,'ya');
mysql> insert into test(id,name) values(9,'ting');
# innobackupex --defaults-file="/etc/my.cnf" --user=root -proot --socket=/tmp/mysql.sock --apply-log --use-memory=1G /opt/2017-05-18_00-13-42/
#备注: --use-memory,设置指定分配多少内存处理数据,可以加快处理速度
1) 删除原有的数据
# /etc/init.d/mysqld stop
2) 恢复数据(也可以mv命令)
3) 查看binlog文件名和位置点
# cat xtrabackup_binlog_pos_innodb
mysql-bin.000002 1461
4) 修改权限
# chown -R mysql.mysql data
5) 启动mysql
# /etc/init.d/mysqld start
mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';
mysql> FLUSH PRIVILEGES;
mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=1461;
mysql> start slave;
mysql> show slave status\G;
1、应用场景
1) 误删除恢复
2) 延迟测试(当有延迟时业务是否会受影响)
3) 历史查询
2、启用方法
mysql> stop slave;
mysql> change master to master_delay = 3600; #延迟的时间,单位秒
mysql> start slave;
3、查看
mysql> show slave status\G
SQL_Delay: 3600 #从库延时1小时后同步数据
SQL_Remaining_Delay: 3561 #从库延时的实际时间
主库:
1) 修改配置文件
[mysqld]
server-id=1 #不能用从库相同
log_bin=mysql-bin #开启日志
2)** 创建主从复制用户**
mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123';
3)** 查看主库binlog位置点**
show master status;
从库:
1)** 修改配置文件**
[mysqld]
server-id=2
read_only=1
2)** 配置主从**
mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=1558;
mysql> start slave;
mysql> set global read_only=1; #从库只读
3、部署延时同步
延时从库配置方法
1、停止主从
mysql> stop slave;
2、设置延时为180秒
mysql> CHANGE MASTER TO MASTER_DELAY = 180;
3、开启主从
mysql> start slave;
4、查看状态
mysql> show slave status\G
SQL_Delay: 180
5、 企业中一般会延时3-6小时
1) 思路
1、停止SQL线程
mysql> stop slave sql_thread;
2、截取relaylog到误删除之前点
relay-log.info 获取到上次运行到的位置点,作为恢复起点
分析relay-log的文件内容,获取到误删除之前position
2) 模拟故障
1、从库,关闭SQL线程
mysql > stop slave sql_thread;
2、截取relay-log
1) 起点:
db01-relay-bin.000002 283
2) 终点:
mysql > show relaylog events in 'db01-relay-bin.000002'
db01-relay-bin.000002 | 268047
3、导出sql
4、恢复relay.sql
mysql> set sql_log_bin=0;
mysql> source /tmp/relay.sql
mysql> set sql_log_bin=0;
5、查看数据
mysql> show tables;
1、主库
1) 安装插件
mysql> show global variables like 'have_dynamic_loading'; #查看是否有动态支持
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so'; #安装插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #启动插件
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #设置超时(毫秒)
2) 修改配置文件
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
3) 检查安装
mysql> show variables like'rpl%';
mysql> show global status like 'rpl_semi%'
2、从库
1) 安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so'; #安装slave半同步插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #启动插件
mysql> stop slave io_thread; start slave io_thread; #重启io线程使其生效
2) 修改配置文件
[mysqld]
rpl_semi_sync_slave_enabled =1
3、相关参数说明
rpl_semi_sync_master_timeout=milliseconds
超时时间,如果Master在超时之前没有收到任何确认,将恢复到异步复制,继续执行没有半同步的复制操作
rpl_semi_sync_master_wait_no_slave={ON|OFF}
默认ON,一个事务被提交,Master没有Slave连接,会等待Slave的连接,并确认事务写到磁盘上,设置OFF,如果没有Slave连接,Master恢复到异步复制
1、创建两个数据库(test1和test2)
mysql> create database test1;
mysql> create database test2;
2、查看复制状态
mysql> show global status like 'rpl_semi%';
3、关闭半同步(1:开启,0:关闭)
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 0;
4、查看半同步状态
mysql> show global status like 'rpl_semi%';
5、再一次创建两个库
mysql> create database test3;
mysql> create database test4;
6、再一次查看半同步状态
mysql> show global status like 'rpl_semi%';
注: 在半同步状态,查询会有延迟时间,关闭之后则没有
1) Sending binlog event to slave
Binlog dump 线程已读取完binlog日志中的event,现在正在发送给从库
2) Finished reading one binlog; switching to next binlog
Binlog dump 线程已读取完一个binlog日志,现在正在打开下一个binlog日志,并发送给从库
Master has sent all binlog to slave; waiting for binlog to be updated
Binlog dump 线程已读取完所有binlog日志,并已发送到从库,处于空闲状态,等待读取新的binlog
Waiting to finalize termination
当线程停止的时,显示此状态,很短暂,几乎看不到
1) Connecting tomaster
线程正连接主库
2) Checking masterversion
线程检查主库版本
3) Registering slaveon master
线程在主库注册
4) Requesting binlog dump
线程请求binlog,从指定的binlog名和位置点,开始的获取主库的日志
5) Waiting toreconnect after a failed binlog dump request
线程请求失败,进入睡眠状态,等待请求重连,可通过--master-connect-retry设置重试的间隔
6) Reconnectingafter a failed binlog dump request
线程请求重连主库
7) Waiting for master to send event
线程等待主库发送日志
8) Queueing masterevent to the relay log
线程已读取一个日志,并写到relay log中
9) Waiting reconnectafter a failed master event read
线程读取时,出现的错误(因为连接断开),重连前,线程进入sleep状态,sleep的时间: master_connect_try(默认60秒)
10) Reconnectingafter a failed master event read
线程正在尝试重连主库
11) Waiting for theslave SQL thread to free enough relay log space
中继日志已满,I/O线程正在等待SQL线程,通过删除relay log,来释放中继日志的空间,因为设置了relay_log_space_limit参数
12) Waiting for slavemutex on exit
当线程停止的时,显示此状态,很短暂,几乎看不到
1) Reading event from the relay log
线程已从中继日志,读取了一个event
2) Has read allrelay log; waiting for the slave I/O thread to update it
线程已处理了中继日志中所有event,正等待IO线程,写人新的日志
3) Waiting for slavemutex on exit
当线程停止的时,显示此状态,很短暂,几乎看不到
#!/bin/sh
MYUSER=root
MYPASS=$(more /mysql/passwd)
MYSOCK=/data/3306/mysql.sock
MAIN_PATH=/server/backup
DATA_PATH=/server/backup
LOG_FILE=${DATA_PATH}/mysqllogs_`date+%F`.log
DATA_FILE=${DATA_PATH}/mysql_backup_`date+%F`.sql.gz
MYSQL_PATH=/application/mysql/bin
MYSQL_CMD="$MYSQL_PATH/mysql-u$MYUSER -p$MYPASS -S $MYSOCK"
MYSQL_DUMP="$MYSQL_PATH/mysql-u$MYUSER -p$MYPASS -S $MYSOCK -A -B --master-data=1 --single-transaction -e"
${MYSQL_DUMP} |gzip > $DATA_FILE
#!/bin/sh
MYUSER=root
MYPASS='123456'
MYSOCK=/data/3306/mysql.sock
MAIN_PATH=/server/backup
DATA_PATH=/server/backup
LOG_FILE=${DATA_PATH}/mysqllogs_`date+%F`.log
DATA_FILE=${DATA_PATH}/mysql_backup_`date+%F`.sql.gz
MYSQL_PATH=/application/mysql/bin
MYSQL_CMD="$MYSQL_PATH/mysql-u$MYUSER -p$MYPASS -S $MYSOCK"
#恢复全备
cd ${DATA_PATH}
gzip -d mysql_backup_`date+%F`.sql.gz
$MYSQL_CMD <mysql_backup_`date +%F`.sql
#配置主从
cat $MYSQL_CMD << EOF
CHANGE MASTER TO
MASTER_HOST='192.168.1.2',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='test123',
EOF
$MYSQL_CMD -e "start slave;"
$MYSQL_CMD -e "show slave status\G" | egrep "IO_Running|SQL_Running" > $LOG_FILE
mail -s "mysql slave result" aaa@abc.com < LOG_FILE
1、zabbix-agent端(被监控的Mysql服务器)
1) 安装php环境
2) 安装percona插件
3) 配置参数
4) 将模板include到配置文件中
Include=/etc/zabbix/zabbix_agentd.d/
5) 重启服务
service zabbix-agent restart
2、修改监控相关的脚本(被监控的Mysql服务器)
1) 添加监控用户
mysql> GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY 'zabbixpassword';
mysql> flush privileges;
2) 编辑监控的php配置文件
<?php
$mysql_user = 'zabbix';
$mysql_pass = 'zabbixpassword';
3) 编辑ss_get_mysql_stats.php文件
$mysql_user = 'zabbix';
$mysql_pass = 'zabbixpassword';
$mysql_port = 3306;
$mysql_socket = "/tmp/mysql.sock";
3、在zabbix-agent客户端测试(要能获取数据,否则无法获取监控数据)
1) 导入监控模板
2) 修改日志权限
chown -R zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt
3) 添加客户端模板
4) 通过服务端验证是否生效,并查看图像
# zabbix_get -s 192.168.3.12 -k MySQL.file-reads
1、在slave的节点,修改slave上的监控脚本
RES=`HOME=~zabbix mysql -h192.168.3.13 -uzabbix -pzabbixpassword -S /tmp/mysql.sock
-e 'SHOW SLAVE STATUS\G' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`
2、监控主从同步
1) 监控主从同步状态
UserParameter=MySQL.running-slave,/usr/local/zabbix_agents_3.2.0/scripts/get_mysql_stats_wrapper.sh running-slave
2) 主从延迟多少秒
UserParameter=MySQL.slave-lag,/usr/local/zabbix_agents_3.2.0/scripts/get_mysql_stats_wrapper.sh jj
3) 要注意php的路径
CMD="/usr/local/php/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items gg"
4) 执行的时候发出警告,会报错:不支持的key
5) 解决办法:
RES=`HOME=/usr/local/zabbix_agents_3.2.0/scripts /usr/local/mysql/bin/mysql -S /tmp/mysql.sock
-e 'SHOW SLAVE STATUS\G' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`
语句中接入HOME目录,并且在该目录下创建.my.cnf文件,将账户密码写入这个文件,mysql在连接数据库的时候就会去读取这个文件,就绕过了不安全的提示
[client]
user=zabbix
password=zabbix
3、测试报警
mysql> stop slave;
手机扫一扫
移动阅读更方便
你可能感兴趣的文章