–—————————Mysql—————————–
select version(); #查看mysql版本
stop slave;set global sql_slave_skip_counter=1;start slave;
#从库不同步处理,第二句表示跳过一步错误,后面的数字可变
#从库不同步处理,复制的时候忽略指定的表
stop slave ;
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('库.表');
start slave;
#去掉忽略表
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ();
#主从同步change master to语法
change master to master_host='192.168.1.4',master_user='slave',master_password='Aa123456',master_port=13306,master_log_file='mysql-bin.000201',master_log_pos=628152168;
#设置MySQL为只读模式
show global variables like "%read_only%";
flush tables with read lock;
set global read_only=1;
show global variables like "%read_only%";
#将MySQL从只读设置为读写状态
unlock tables;
set global read_only=0;
select a.id,a.column,b.id,b.column from a left join b on a.id = b.id #关联查询
select CONCAT_WS(‘#’,str1,str2,…) from #查询结果以"#"号分隔
show master logs; #查看总共有几个binlog文件
set global expire_logs_days = 10;flush logs; #设置自动删除binlog文件的天数
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); #删除10天前的binlog日志
PURGE MASTER LOGS BEFORE '2000-01-01 00:00:00'; #删除2000-01-01 00:00:00时间之前前的binlog日志
show variables like '%expire_logs_days%'; #查看日志保留时间
show full processlist; #查看进程
alter table old_db.mytable rename new_db.mytable #把表从一个库移到另一个库
#解决glibc的内存管理器自身缺陷导致mysql内存占用越来越高
gdb --batch --pid `pidof mysqld` --ex 'call malloc_trim(0)'
#mysql查询结果以utf8编码导出到txt文件
mysql -h 127.0.0.1 -u用户名 -p密码 --default-character-set=utf8 -e "sql语句" > tt.txt
#解析binlog二进制文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 > /tmp/000001.txt
- 获取mysql内存使用情况的脚本
#!/bin/sh
# you might want to add some user authentication here
#mysql -S /tmp/mysql3312.sock -u$1 -p$2 -e "show variables; show status" | awk '
mysql -u$1 -p$2 -e "show variables; show status" | awk '
{
VAR[$1]=$2
}
END {
MAX_CONN = VAR["max_connections"]
MAX_USED_CONN = VAR["Max_used_connections"]
BASE_MEM=VAR["key_buffer_size"] + VAR["query_cache_size"] + VAR["innodb_buffer_pool_size"] + VAR["innodb_additional_mem_pool_size"] + VAR["innodb_log_buffer_size"]
MEM_PER_CONN=VAR["read_buffer_size"] + VAR["read_rnd_buffer_size"] + VAR["sort_buffer_size"] + VAR["join_buffer_size"] + VAR["binlog_cache_size"] + VAR["thread_stack"] + VAR["tmp_table_size"] + VAR["net_buffer_length"]
MEM_TOTAL_MIN=BASE_MEM + MEM_PER_CONN*MAX_USED_CONN
MEM_TOTAL_MAX=BASE_MEM + MEM_PER_CONN*MAX_CONN
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "key_buffer_size", VAR["key_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "query_cache_size", VAR["query_cache_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_buffer_pool_size", VAR["innodb_buffer_pool_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_additional_mem_pool_size", VAR["innodb_additional_mem_pool_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_log_buffer_size", VAR["innodb_log_buffer_size"]/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "BASE MEMORY", BASE_MEM/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "sort_buffer_size", VAR["sort_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "read_buffer_size", VAR["read_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "read_rnd_buffer_size", VAR["read_rnd_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "join_buffer_size", VAR["join_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "thread_stack", VAR["thread_stack"]/1048576
printf "| %40s | %15.3f MB |\n", "binlog_cache_size", VAR["binlog_cache_size"]/1048576
printf "| %40s | %15.3f MB |\n", "tmp_table_size", VAR["tmp_table_size"]/1048576
printf "| %40s | %15.3f MB |\n", "net_buffer_length", VAR["net_buffer_length"]/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "MEMORY PER CONNECTION", MEM_PER_CONN/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %18d |\n", "Max_used_connections", MAX_USED_CONN
printf "| %40s | %18d |\n", "max_connections", MAX_CONN
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "TOTAL (MIN)", MEM_TOTAL_MIN/1048576
printf "| %40s | %15.3f MB |\n", "TOTAL (MAX)", MEM_TOTAL_MAX/1048576
printf "+------------------------------------------+--------------------+\n"
}'
- 获取表最后三个分区名
SELECT
TABLE_SCHEMA AS '数据库',
TABLE_NAME AS '表名',
GROUP_CONCAT(
CASE
WHEN rn = 1 THEN CONCAT('倒数第一: ', PARTITION_NAME)
WHEN rn = 2 THEN CONCAT('倒数第二: ', PARTITION_NAME)
WHEN rn = 3 THEN CONCAT('倒数第三: ', PARTITION_NAME)
END
ORDER BY
rn SEPARATOR ', '
) AS '最后三个分区'
FROM
(
SELECT
TABLE_SCHEMA,
TABLE_NAME,
PARTITION_NAME,
ROW_NUMBER() OVER (
PARTITION BY
TABLE_SCHEMA,
TABLE_NAME
ORDER BY
PARTITION_ORDINAL_POSITION DESC
) as rn
FROM
information_schema.PARTITIONS
WHERE
TABLE_SCHEMA NOT IN('information_schema', 'mysql', 'performance_schema', 'sys')
AND PARTITION_NAME IS NOT NULL
) ranked
WHERE
rn <= 3 -- 修改为获取最后三个分区
GROUP BY
TABLE_SCHEMA,
TABLE_NAME
HAVING
COUNT(*) >= 1 -- 至少有一个分区
ORDER BY
TABLE_SCHEMA,
TABLE_NAME;
- 获取mysql内存使用情况的SQL
select
SUBSTRING_INDEX(event_name, '/', 2) as code_area,
FORMAT_BYTES(SUM(current_alloc)) as current_alloc
from
sys.x$memory_global_by_current_bytes
group by
SUBSTRING_INDEX(event_name, '/', 2)
order by SUM(current_alloc) desc;
- 备份脚本及恢复,前提:必须开启binlog, 若没开启log_bin,则修改mysql配置文件my.cnf,添加以下配置,重启mysql使配置生效
全量备份脚本:
#!/bin/bash
backuppath="/home/ccodrunner/mysqlforbak"
backupdate=`date +%Y%m%d`
logpath="/home/ccodrunner/mysqlforbak/log"
logfile="/home/ccodrunner/mysqlforbak/log/backup-0.log"
username="ucds"
password="ucds"
if [ ! -d $backuppath ];then
mkdir -p $backuppath
fi
if [ ! -d $logpath ];then
mkdir -p $logpath
fi
echo "" >> $logfile
echo "-------------------" >> $logfile
echo "BACKUP DATE:"$(date +"%Y-%m-%d %H:%M:%S") >> $logfile
echo "-------------------" >> $logfile
#备份全库
/usr/bin/mysqldump -u$username -p$password --all-databases --flush-logs --single-transaction --quick --delete-master-logs > $backuppath/alldb_${backupdate}.sql
if [[ $? == 0 ]];then
cd $backuppath
tar -zcvf alldb_${backupdate}.sql.tar.gz alldb_${backupdate}.sql
echo "Backup Successful !" >> $logfile
else
echo "Database Backup Fail !" >> $logfile
fi
echo "Backup Process Done !" >> $logfile
#删除7天前的备份
find $backuppath -mtime +7 -name "*.sql.tar.gz" -exec rm -rf {} \\;
rm -rf $backuppath/alldb_${backupdate}.sql
echo "Delete Process Done" >> $logfile
增量备份脚本:
#!/bin/bash
backuppath="/home/ccodrunner/mysqlforbak/BinLogBack"
mysqlpath="/var/lib/mysql"
logpath="/home/ccodrunner/mysqlforbak/log"
logfile="/home/ccodrunner/mysqlforbak/log/backup-1.log"
binFile="/var/lib/mysql/mysql-bin.index"
username="ucds"
password="ucds"
if [ ! -d $backuppath ];then
mkdir -p $backuppath
fi
if [ ! -d $logpath ];then
mkdir -p $logpath
fi
echo "" >> $logfile
echo "-------------------" >> $logfile
echo "BACKUP DATE:"$(date +"%Y-%m-%d %H:%M:%S") >> $logfile
echo "-------------------" >> $logfile
/usr/bin/mysqladmin -u$username -p$password flush-logs
counter=`wc -l $binFile | awk '{print $1}'`
nextNum=0
for file in `cat $binFile`
do
base_file=`basename $file`
#basename 用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
nextNum=`expr $nextNum + 1`
if [ $nextNum -eq $counter ]
then
echo "$base_file skip !" >> $logfile
else
dest=$backuppath/$base_file
if (test -e $dest)
then
echo "$base_file exist !" >> $logfile
else
cp $mysqlpath/$base_file $backuppath
echo "$base_file copying" >> $logfile
fi
fi
done
echo [PartBack] `date +"%Y%m%d %H:%M:%S"` $nextNum Backup successful ! >> $logfile
定时任务:
01 03 * * 0 /bin/bash 全量备份脚本路径 >/dev/null 2>&1
01 03 * * 1-6 /bin/bash 增量备份脚本路径 >/dev/null 2>&1
恢复:
1、先恢复完整库: mysql -u root -p school < /opt/school.sql
2、恢复 增量备份: msyqlbinlog –no-defaults msyql-bin.0000002 | msyql -u root -p
mysql双主 + keepalived主备
| 机器IP | 操作系统 | 部署应用 |
|---|---|---|
| 192.168.7.54 | Centos7.6 | msyql-8.0.26、keepalived-1.3.5 |
| 192.168.7.55 | Centos7.6 | msyql-8.0.26、keepalived-1.3.5 |
| 192.168.7.58 | keepalived的VIP |
安装mysql-8.0.26
以下操作,两个mysql节点都要执行
- 环境准备
#关闭防火墙
systemctl stop firewalld.service && systemctl disable firewalld.service
#关闭selinux
setenforce 0 && sed -i 's/enable/disable/g' /etc/selinux/config
#查看是否有自带的mariadb,有就卸载
rpm -qa | grep mariadb
- 官网下载安装包,rpm包安装 https://downloads.mysql.com/archives/community/
mysql-community-client-8.0.26-1.el7.x86_64.rpm
mysql-community-client-plugins-8.0.26-1.el7.x86_64.rpm
mysql-community-common-8.0.26-1.el7.x86_64.rpm
mysql-community-libs-8.0.26-1.el7.x86_64.rpm
mysql-community-server-8.0.26-1.el7.x86_64.rpm
- 替换初始配置文件 /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
skip-grant-tables
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
#数据目录
datadir=/var/lib/mysql
#错误日志
log-error=/var/log/mysqld.log
#server-id必须是唯一的,两个节点不能相同
server-id=54
#开启GTID
gtid_mode=ON
#强制GTID的一致性
enforce_gtid_consistency=ON
#最大连接数
max_connections=8192
#表名大小写不敏感
lower_case_table_names=1
#开启慢查询日志
slow_query_log=1
#查询超时时间(秒)
long_query_time=30
#日志的过期时间
expire_logs_days=7
#跳过主从复制中的1062错误类型
slave_skip_errors=1062
#开启定时任务
event-scheduler=ON
#默认134217728,单位byte(也就是128MB),建议修改为机器总内存的70%
innodb_buffer_pool_size=134217728
#降低底层硬件IO
innodb_flush_log_at_trx_commit=2
#设置默认密码验证插件
default-authentication-plugin=mysql_native_password
#隔离级别是RC,减少锁粒度
transaction_isolation=READ-COMMITTED
#启用binlog功能,并指定路径名称
log_bin=/var/lib/mysql/mysql-bin
#binlog格式,MGR要求必须是ROW,不过就算不是MGR,也最好用row
binlog_format=row
#因为集群会在故障恢复时互相检查binlog的数据,
#所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=1
- 设置开机启动mysql,并启动mysql
systemctl enable mysqld && systemctl start mysqld
#由于配置文件里面有skip-grant-tables这个参数,首次可以直接不需要输入密码进入mysql控制台
mysql -uroot -p
#设置初始密码为,并刷新权限,初始密码为:Well123,
mysql> UPDATE mysql.user SET authentication_string='*66D63C40F96BAD4D43FB214CD53BDEB0268DD935' WHERE user='root';
mysql> flush privileges;
#删除配置文件的跳过权限验证参数
sed -i '/skip-grant-tables/d' /etc/my.cnf
#重启mysqld服务
systemctl restart mysqld
#使用新密码登陆控制台,后续需要修改其他密码可以自行修改,我这里修改为Aa123456
mysql -uroot -pWell123,
mysql> set persist validate_password.policy=0;
mysql> set persist validate_password.length=4;
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'Aa123456';
mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;
mysql双主同步
- 创建同步账号并设置节点为只读模式(两个节点都操作) 用户:repl_user 密码:welljoint_789
mysql -uroot -pAa123456
#创建同步账号
mysql> CREATE USER 'repl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'welljoint_789';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
mysql> flush privileges;
#设置节点为只读模式
mysql> flush tables with read lock;
mysql> set global read_only=1;
- 两个节点分别查询master状态,记录File和Position
192.168.7.54:
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 | 2047 | | | 9375d0b5-3c77-11ed-87a3-000c2992579c:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
File为mysql-bin.000003,Position为2047
192.168.7.55:
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 | 2047 | | | 9375d0b5-3c77-11ed-87a3-000c2992579c:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
File为mysql-bin.000003,Position为2047
- 配置双主
192.168.7.54:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.7.55', MASTER_USER='repl_user', MASTER_PASSWORD='welljoint_789', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2047;
其中MASTER_HOST为另外一个节点的IP,MASTER_LOG_FILE为192.168.7.55查询出来的File,MASTER_LOG_POS为192.168.7.55查询出来的Position
192.168.7.55:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.7.54', MASTER_USER='repl_user', MASTER_PASSWORD='welljoint_789', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2047;
其中MASTER_HOST为另外一个节点的IP,MASTER_LOG_FILE为192.168.7.54查询出来的File,MASTER_LOG_POS为192.168.7.55查询出来的Position
- 将MySQL从只读设置为读写状态(两个节点都操作)
mysql> unlock tables;
mysql> set global read_only=0;
- 开启双主同步(两个节点都操作)
mysql> start slave;
- 查看同步状态(两个节点都操作)
mysql> show slave status\\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.7.55
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 2047
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Slave_IO_Running 和 Slave_SQL_Running 都为Yes即表示正常
安装keepalived-1.3.5
- 两个节点都通过yum安装
yum -y install keepalived
yum -y install psmisc #安装killall命令
- 修改配置文件 /etc/keepalived/keepalived.conf(192.168.7.54)
! Configuration File for keepalived
global_defs {
vrrp_skip_check_adv_addr
}
vrrp_script check_Mysqld {
script "killall -0 mysqld"
interval 5
fall 2
rise 2
weight -50
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 66
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass Aa123456
}
virtual_ipaddress {
192.168.7.58
}
track_script {
check_Mysqld
}
}
- 修改配置文件 /etc/keepalived/keepalived.conf(192.168.7.55)
! Configuration File for keepalived
global_defs {
vrrp_skip_check_adv_addr
}
vrrp_script check_Mysqld {
script "killall -0 mysqld"
interval 5
fall 2
rise 2
weight -50
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass Aa123456
}
virtual_ipaddress {
192.168.7.58
}
track_script {
check_Mysqld
}
}
两个配置文件除了 priority 这个代表权重的参数不一样,其他都一致,值越大权重越高的为主节点; interface为网卡名称,不一样的话注意修改
- 开机启动keepalived,并启动keepalived(两个节点都操作)
systemctl enable keepalived && systemctl restart keepalived
- 查看结果
192.168.7.54:
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:92:57:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.7.54/24 brd 192.168.7.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe92:579c/64 scope link
valid_lft forever preferred_lft forever
192.168.7.55:
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:d2:93:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.55/24 brd 192.168.7.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 192.168.7.58/32 scope global ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed2:93a2/64 scope link
valid_lft forever preferred_lft forever
VIP 192.168.7.58在192.168.7.55上,停掉192.168.7.55的mysql后VIP会漂移到192.168.7.54上
–—————————Oracle—————————–
lsnrctl start #打开oracle监听
sqlplus #进入oracle
sqlplus / as sysdba #以dba身份连接到sql控制台
shutdown immediate #停止服务
startup #启动服务
#oracle查看表空间:
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
#oracle表空间扩容:
select * from dba_data_files where tablespace_name = 'SD_TABLE_SD_0211300003';
alter tablespace SD_TABLE_SD_0211300003 add datafile '/home/oracle/oracle10g/db_files/SD/SD_TABLE_sd_02113000033.dbf' size 10240M autoextend on;
#查询所有表空间名
select tablespace_name from dba_tablespaces
#删除表空间和数据文件
drop tablespace space_name including contents and datafiles
–—————————Redis—————————–
# 查看某个键的值
echo "GET $KEY" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 以秒为单位返回key的剩余过期时间
echo "TTL $KEY" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 查看当前数据库中key的数量
echo "DBSIZE" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 获取Redis的所有配置信息
echo "CONFIG GET *" | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 读取 cms:instances:active 有序集合的全部成员
echo 'ZRANGE cms:instances:active 0 -1' | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 从cms:instances:active 有序集合中精准删除指定成员,必须和集合中存储的内容完全一致(包括特殊字符)
echo 'ZREM cms:instances:active "xxx"' | redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning
# 统计特定前缀的 key 数量
redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB_INDEX -a $REDIS_PASSWORD --no-auth-warning --scan --pattern "test:task:*" | wc -l
