MYSQL运维笔记

CREATE USER 'glkj'@'%' IDENTIFIED WITH mysql_native_password BY 'Rmodi_1130';

https://www.cnblogs.com/igoodful/p/15331716.html

克隆MYSQL搭建主从:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

或者

在配置文件中加入:

plugin-load-add=mysql_clone.so

这两个方法只需要任意做一个就可以了。

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'clone';

本地克隆:

clone local data directory ="/home/work/apple";

远程克隆:

在源库创建克隆账号并授权:

CREATE USER clone IDENTIFIED by 'clone';

GRANT BACKUP_ADMIN ON *.* TO 'clone';

在目标库中执行:

set global clone_valid_donor_list ='192.168.137.5:3306';

clone instance from 'clone'@'192.168.137.5':3306 identified by 'clone';

克隆完后两边的库就是一模一样的了。

查看克隆进度:

# 在目标实例上执行:

SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status;

select

state,

cast(begin_time as datetime) as "start time",

case when end_time is null then lpad(sys.format_time(power(10,12) * (unix_timestamp(now()) - unix_timestamp(begin_time))), 10, ' ')

else lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ' ')

end as duration,

source,destination,

binlog_file,binlog_position,

gtid_executed

from

performance_schema.clone_status \G;

在从库中执行:

change master to master_host='192.168.137.5',master_port=3306,master_user='repl',master_password='repl',master_auto_position=1;

start slave;

show slave status \G

mysql多实例管理:

mkdir -p /application/330{7,8,9}/data

cat >/application/3307/my.cnf <<EOF

[mysqld]

basedir=/application/mysql

datadir=/

socket=

log_error=

port=

server_id=7

log_bin=

EOF

cat >/application/3308/my.cnf <<EOF

[mysqld]

basedir=/application/mysql

datadir=/

socket=

log_error=

port=

server_id=8

log_bin=

EOF

cat >/application/3309/my.cnf <<EOF

[mysqld]

basedir=/application/mysql

datadir=/

socket=

log_error=

port=

server_id=9

log_bin=

EOF

mv /etc/my.cnf  /etc/my.cnf.bak

mysqld --initialize-insecure  --user=mysql  --datadir=/application/3307/data --basedir=/application/mysql

mysqld --initialize-insecure  --user=mysql  --datadir=/application/3308/data --basedir=/application/mysql

mysqld --initialize-insecure  --user=mysql  --datadir=/application/3309/data --basedir=/application/mysql

cd /etc/systemd/system

cp mysqld.service mysqld3307.service

cp mysqld.service mysqld3308.service

cp mysqld.service mysqld3309.service

MYSQL双主双从搭建:

MYSQL二进制的安装方法:

1、解压源码包

2、检查系统中有没有MariaDB,如果有就要将其清除掉,否则就会有冲突

rpm -qa | grep mariadb

yum remove  mariadb-libs

3、增加mysql用户:

useradd mysql

4、编辑环境变量:

vi /etc/profile

export PATH=/application/mysql8/bin:$PATH

source  /etc/profile

5、更改目录属组:

chown -R mysql:mysql  /application/mysql8/

6、初始化数据库:

mysqld --initialize  --user=mysql  --lower-case-table-names=1  --basedir=/application/mysql8  --datadir=/application/mysql8/data

mysqld --initialize-insecure  --user=mysql --lower-case-table-names=1  --basedir=/application/mysql8 --datadir=/application/mysql8/data

7、创建配置文件:

cat >/etc/my.cnf <<EOF

[mysqld]

user=mysql

basedir=/application/mysql8

datadir=/application/mysql8/data

server_id=155

port=3306

[mysql]

EOF

8、拷贝文件:

cp  /application/mysql8/support-files/mysql.server  /etc/init.d/mysqld

cp  /home/data/mysql/support-files/mysql.server  /etc/init.d/mysqld

9、启动mysql:

service mysqld restart

注意,让复制用户在每个服务器上登录一下,看能不能登录!这一点很关键!

change master to master_host='192.168.43.96',master_user='repl',master_password='repl',\

master_log_file=' binlog.000001',master_log_pos=155;

1、首先要创建一个和原表一样的结果表,来存放要归档的数据:

create table t2 like t1;

2、归档表,归档的表要有主键:

pt-archiver --source h=192.168.137.5,D=test,t=pt1,u=pt,p=toolkit \

--dest h=192.168.137.5,D=test,t=pt2,u=pt,p=toolkit --where 'id <4' --no-check-charset --no-delete --limit=1000 \

--commit-each --progress 1000  --statistics

建立一个用户来做归档:

create user pt identified with mysql_native_password  by 'toolkit';

grant all on *.*  to  pt;

pt-archiver --source h=192.168.137.5,D=test,t=pt1,u=pt,p=toolkit \

--dest h=192.168.137.5,D=test,t=pt2,u=pt,p=toolkit --where 'id<4' --no-check-charset --no-delete --limit=100 \

--commit-each --progress 200 --statistics

归档完清理原表的数据:

pt-archiver --source h=192.168.137.5,D=test,t=pt1,u=pt,p=toolkit --where 'id<4' --purge --limit=1 --no-check-charset

pt-archiver --source h=192.168.137.5,D=test,t=pt1,u=pt,p=toolkit \

--where 'id<4' --purge --limit=1 --no-check-charset

PT工具的使用,在线修改表结构:

pt-online-schema-change  --user=pt --password=toolkit --host=192.168.137.5 \

--alter "add column state int not null default 1" D=test,t=pt1  --print --execute

在线建立索引:

pt-online-schema-change  --user=pt --password=toolkit --host=192.168.137.5 \

--alter "add index idx(state)" D=test,t=pt1 --print --execute

检查主从同步的表是否一致:

pt-table-checksum --nocheck-replication-filters  --no-check-binlog-format  \

--replicate=pt.checksums \

--create-replicate-table --databases=test --tables=pt1 \

h=192.168.137.5,u=checksum,p=checksum,P=3306

pt-table-sync  --replicate=pt.checksums  --databases test --tables pt1 \

h=192.168.137.5,u=checksum,p=checksum,P=3306 h=192.168.137.6,u=checksum,p=checksum,P=3306 \

--print

pt-table-sync  --replicate=pt.checksums  --databases test --tables pt1 \

h=192.168.137.5,u=checksum,p=checksum,P=3306 h=192.168.137.6,u=checksum,p=checksum,P=3306 \

--execute

select substring(md5(rand()),1,5);

压力测试:

mysqlslap  --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 \

--create-schema='test' --query="select  *  from  test.t_1 where name='jin'"  \

engine=innodb --number-of-queries=2000  \

-uroot -poracle  -verbose

mysqlslap -uroot -poracle --concurrency=100 --iterations=1 --auto-generate-sql \

--auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement \

--engine=innodb  --number-of-queries=5000

htop  ,iotop ,

iftop  etho  ---- 查看网卡的流量

配置延迟从库:

stop slave;

change master to master_delay=3600;

start slave;

show slave status \G

延迟故障恢复:

stop salve sql_thread;

show relaylog events in 'bin.000002';

mysqlbinlog --start-position=626 --stop-position=1299  db01-relay-bin.00002 >/tmp/relay.sql

备份全库:

mysqldump -uroot -poracle -A -R  --triggers  --set-gtid-purged=OFF  >full.sql   

在从库中进行恢复:

mysql -uroot -p  <full.sql       

快速恢复测试环境:

主库:

reset master;

从库:

drop database delay;

stop slave;

reset salve all;

在从库中执行:

stop slave;

change master to

master_host='192.168.137.5',

master_user='repl',

master_password='repl',

master_port=3306,

master_log_file='binlog.000001',

master_log_pos=3609,

master_connect_retry=10;

change master  to

master_host='192.168.137.5',

master_user='repl',

master_password='repl',

master_auto_position=1;

start slave;

过滤复制的配置:在从库的配置文件中加入一行即可:

replicate_do_db=test

show collation;  查看所有支持的校对规则

show master status; 查看mysql当前使用的二进制日志信息

show  relaylog events in '' ; 查看中继日志的事件信息

翻译binlog日志:

mysqlbinlog --base64-output=decode-rows  -vvv  mysql-bin.00004

截取二进制日志:

mysqlbinlog --start-position=219  --stop-position=335  mysql-bin.000004 >/tmp/a.sql

mysqlbinlog -d  test  mysql-bin.000004  只显示test库的日志

全局事务ID:每个一个事务都会分配一个ID。GTID由SERVER_UUID+事务ID组成。

开启GTID模式只需要在配置文件中加入两行就可以了:

enforce_gtid_consistency=on

gtid_mode=on

截取GTID:

show binlog events in 'binlog.000002';  查看二进制日志的事件信息

截取BINLOG:这样截取后,在恢复的时候会报错!

mysqlbinlog  --include-gtids='79de5cd0-78d0-11ec-b2ba-080027199538:1-3' binlog.000002>/tmp/gtid.sql

加上下面的参数就可以了:

mysqlbinlog  --skip-gtids  --include-gtids='79de5cd0-78d0-11ec-b2ba-080027199538:1-3' binlog.000002>/tmp/gtid.sql

--skip-gtids:在导出时,忽略原有的GTID信息,恢复时生成最新的GTID信息

set sql_log_bin=0;  临时关闭恢复时产生的新二进制日志

source /tmp/gtid.sql

set sql_log_bin=1;  开启

开启慢日志:

slow_query_log=1

slow_query_log_file=/var/log/slow.log

long_query_time=3

log_queries_not_using_indexes

分析慢日志,找到慢SQL:

mysqldumpslow -s -c -t 10  /var/log/slow.log

-c 表示次数

pt-query-diagest    /var/log/slow.log

alter table city add index idx_1(district(5))  前缀索引

select district, group_concat(name)  from city  group by district;

LIMIT M,N  :跳过M行,显示N行

LIMIT Y OFFSET X :跳过X行,显示一共Y行

全备:

mysqldump -uroot -poracle -A >/backup/full.sql

备份多个库:

mysqldump -uroot -poracle -B test db1 db2  >/backup/DB.sql

备份一个库中的多个表:

mysqldump -uroot -poracle  test t_1 t_2 >/backup/T.sql

-R 存储过程和函数

-E 事件

--triggers

--master-data=2

1.记录备份时刻的binlog信息

2.自动锁表

不加 --single-transaction ,温备份

加了 --single-transaction  对于innodb表不锁表备份

--single-transaction

对于innodb表不锁表,一致性的备份

全备:

mysqldump -uroot -poracle -A --master_data=2 --single-transaction -R -E --triggers >/tmp/full.sql

全备:

mysqldump -uroot -poracle -A -R --max_allowed_packet=128M --triggers  --set-gtid-purged=OFF \

--master-data=2 --single-transaction|gzip >/backup/full_$(date +%F).sql.gzip

升级完后执行这个命令:

mysql_upgrade  -uroot -p123  -S /data/3308/mysql.sock

全备:

innobackupex --user=root --password=oracle --no-timestamp  /backup/full

第一次增量备份:

innobackupex --user=root --password=123 --no-timestamp  --incremental

--incremental-basedir=/backup/full  /backup/inc1

第二次增量备份:

innobackupex --user=root --password=123 --no-timestamp  --incremental

--incremental-basedir=/backup/inc1  /backup/inc2

恢复:

innobackupex  --apply-log  --redo-only  /backup/full

innobackupex  --apply-log  --redo-only  --incremental-dir=/backup/inc1  /backup/full

innobackupex  --apply-log  --incremental-dir=/backup/inc2  /backup/full

innobackupex  --apply-log  /backup/full

判断连接数是否够用:

show variables like 'max_connections';

show status like 'Max_used_connections';

查看临时表的缓冲区是否够用:KEY_BUFFER_SIZE

show status like '%Created_tmp%';

双一标准:

innodb_flush_log_at_trx_commit=1

sync_binlog=1

innodb_flush_method=0_direct

监控锁:

show status like 'innodb_row_lock%';

看被阻塞的事务:

select  *  from  information_schema.innodb_trx where trx_state='LOCK WAIT';

查看锁源,谁锁的我

select *  from  sys.innodb_lock_waits;

根据锁源的PID,找到锁源SQL的线程ID

select *  from performance_schema.threads where processlist_id=;

根据锁源SQL线程ID,找到锁源的SQL语句

select * from  performance_schema.events_statements_current where thread_id=;

一个表就是一个段,一个段由多个区组成,一个区有64个连续的页组成,一个页16K,一个区就是1M

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容