首页
Search
1
v2ray异常错误之二
3,310 阅读
2
linux时区设置
2,698 阅读
3
DB2常用操作
2,173 阅读
4
websphere修改jvm内存xmx和xms
1,929 阅读
5
nfs客户端文件属主为nobody的现象
1,552 阅读
技术
生活
运动
游戏
电影
登录
Search
标签搜索
docker
linux
troubleshooting
nginx
secure
truenas
mysql
windows
python
esxi
docker swarm
oracle
zabbix
tomcat
blog
dsm
群晖
rpa
freenas
db
yuc
累计撰写
291
篇文章
累计收到
0
条评论
首页
栏目
技术
生活
运动
游戏
电影
页面
搜索到
289
篇与
的结果
2024-05-07
mysql批量转换表名大小写
转换方法 使用存储过程来批量转换 DELIMITER // DROP PROCEDURE IF EXISTS uppercase // CREATE PROCEDURE uppercase(IN dbname VARCHAR(200)) BEGIN DECLARE done INT DEFAULT 0; DECLARE oldname VARCHAR(200); DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema = dbname; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; REPEAT FETCH cur INTO oldname; SET @newname = UPPER(oldname); #IF newname equals to oldname, do nothing; #select 'a' <> 'A'; -> 0 #select 'a' <> BINARY 'A'; -> 1 SET @isNotSame = @newname <> BINARY oldname; IF NOT done && @isNotSame THEN SET @SQL = CONCAT('rename table ',oldname,' to ',@newname); PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt; DEALLOCATE PREPARE tmpstmt; END IF; UNTIL done END REPEAT; CLOSE cur; END // DELIMITER ; 调用该存储过程: call uppercase('xxx'); 接库名
2024年05月07日
5 阅读
0 评论
0 点赞
2024-05-07
mysql误删恢复
恢复方案 有以下几种数据恢复方式: 方法一: 恢复到上次的备份,无二进制日志(丢失上次备份到当前的数据) 方法二: 恢复到上次的备份,把上次备份到现在的二进制日志中相关表到删除语句之前的日志进行回放(可以恢复到删除语句之前的数据) 方法三: 如果数据量比较小,但是整体库很大,从压缩中提取出来比较慢,那么可以解析出二进制日志的delete sql,手动改写为insert(数据量小的表也等于是全量恢复) Tips. 查询binlog的时候带的参数-d xxx --base64-output=DECODE-ROWS --set-charset=UTF8,但是恢复数据的时候不要带这些参数 如果恢复过程中如果主键数据有问题或者有其他错误,但仍然想恢复这个表数据,可以mysql -uroot -p'xxx' -f 来出现错误的时候强制继续 如何恢复 场景1 如果表创建以及各种操作的binlog都还存在,那么直接拿出这些binlog,指定start时间和stop时间进行恢复,比如: mysqlbinlog --start-datetime="2021-08-08 01:00:00" --stop-datetime="2021-08-08 12:11:00" --database=hsjc_bi /tmp/binlog.000005 | mysql -uroot -p'xxx' 实际的操作应该是先从定时备份中恢复表,然后找到 binlog中表备份之后的时间到数据被删之前的时间段日志,进行应用 场景2 表已经用过一段时间,表被truncate。那么需要一个最近有效的备份,并且备份到最近时间的binlog日志。需要找到truncate的语句,从binlog中,然后truncate语句上下的pos,回放这两个pos前后所有的sql mysqlbinlog --start-position="126577910" --stop-position="126649749" --database=xxx /tmp/binlog.000004 | mysql -uroot -p'xxx' mysqlbinlog --start-position="126649944" --stop-position="126678302" --database=xxx /tmp/binlog.000004 | mysql -uroot -p'xxx' 场景3 没有备份,或者不使用备份的情况下。当然表也没有被truncate,只是被修改或者删除 提取出当前binlog的sql语句 /opt/mysql/8/bin/mysqlbinlog -vv -d oa --base64-output=DECODE-ROWS --set-charset=UTF8 /opt/mysql/8/data/binlog.000063 > fact_xxx.t 把提取出来的全部sql语句,仅过滤出所需表的delete语句 cat fact_ypdlb.t | awk '/DELETE FROM/ && (/oa.fact_ypdlb/ || /`oa`.`fact_ypdlb`/){ while(1){ print $0; getline; if($0 !~ /^###/){ break; }; } }' > oa.fact_ypdlb.delete.txt 处理语句 sed -i 's/^### //g' oa.fact_ypdlb.delete.txt sed -i "s/^DELETE FROM/INSERT INTO/g" oa.fact_ypdlb.delete.txt sed -i "s/^WHERE/VALUES(/g" oa.fact_ypdlb.delete.txt 4.处理语句 sed -i '/@13=.*/a );' oa.fact_ypdlb.delete.txt cat oa.fact_ypdlb.delete.txt | awk -F"=|/*" '{ if($0 ~ /^INSERT|^VALUES|^);/){ print $0; }else{ printf $2","; }; }' > oa.fact_ypdlb.delete.sql sed -i "s/,);$/);/g" oa.fact_ypdlb.delete.sql sed -i 's/,INSERT/);INSERT/g' oa.fact_ypdlb.delete.sql 以上的思路: 因为是没有备份,只能通过binlog的delete语句还原数据 拿到需要恢复的binlog 提取出来相关的delete语句 cat 111.sql | awk '/DELETE FROM/ { while(1){ print $0; getline; if($0 !~ /^###/){ break; }; } }' > 111.txt 处理语句大致为insert into格式 比较有局限性,因为中间可能有不同表。每个表字段数量不同,所以指定处理哪个字段不是很好。所以从这里开始思路有改变 要给每一个insert into语句末尾加上分号(;),可以匹配INSERT INTO关键字,在上面插入即可 sed -i '/INSERT INTO/i );' 002.txt # 第一行和最后一行不对,需要手动修改下。其实第一行无所谓,主要是最后一行少这一部分 语句内的/ / 这一部分是注释,拿掉 sed -i 's#/\* .* \*/#,#g' 002.txt 语句内的开头@1这样的关键是是不能有的,实测拿去执行的话sql显示成功,但数据其实没插入,所以这些关键字拿掉 sed -i 's/@.*=//g' 002.txt 在第六步把字段末尾都替换成了逗号,这是正常的字段分隔符,但是SQL最后一个字段的末尾是不能有的,所以拿掉 sed -i ":label;N;s/,\n);/\n);/g;b label" 002.txt 这里用到了sed匹配换行符,简单搜索了下,sed原理跟换行有些关系,所以默认匹配不到换行,增加: label;N;xxxxx;b label 这一部分即可匹配成功
2024年05月07日
6 阅读
0 评论
0 点赞
2024-05-07
mysql xtrabackup备份恢复
备份脚本 #!/bin/sh #on xtrabackup 8.0.14 # 第一次执行时会检查是否有全备,否则先创建一个全库备份 #/app/percona-xtrabackup-2.4.19/bin/xtrabackup --defaults-file=/app/mysql/my.cnf #-ucgvonline -pcjcgv2019! --socket=/app/mysql/mysql.sock #-P3306 --backup --all-databases --target-dir=/tmp/tmpcheck user="root" pass="xxxx" port="3361" MY_CNF="/etc/my5.cnf" #mysql的配置文件 MYSQL_BASE="/var/lib/mysql80_5/bin" MYSQL="${MYSQL_BASE}/mysql" MYSQL_ADMIN="${MYSQL_BASE}/mysqladmin" TMPPATH="/tmp/tmpcheck" TMPLOG="${TMPPATH}/xtrabackup.$$.log" BACKUP_DIR=/data/backup # 备份的主目录 Xtrabackup_PATH=xtrabackup #INNOBACKUPEX的命令 Xtrabackup_FULLPATH=/usr/bin/$Xtrabackup_PATH #INNOBACKUPEX的命令路径 #mysql目标服务器以及用户名和密码 MYSQL_CMD=" --defaults-file=${MY_CNF} -S /var/lib/mysql80_5/mysql.sock --user=${user} --password=${pass} --port=${port}" MYSQL_UP=" --user=${user} --password=${pass} --port=${port} " #mysqladmin的用户名和密码 time=$(date +'%Y%m%d%H%M%S') FULLBACKUP_IN=$BACKUP_DIR/${port}/ FULLBACKUP_DIR=$BACKUP_DIR/${port}/"$time" # 全库备份的目录 FULLBACKUP_INTERVAL=86400 # 全库备份的间隔周期,时间:秒 ,86400为一日 KEEP_FULLBACKUP=3 # 至少保留几个全库备份 logfiledate=backup_${port}.`date +%Y%m%d%H%M`.txt #开始时间 STARTED_TIME=`date +%s` if [ ! -d "${BACKUP_DIR}" ];then mkdir -pv ${BACKUP_DIR} &> /dev/null fi if [ ! -d "${FULLBACKUP_IN}" ];then mkdir -pv ${FULLBACKUP_IN} &> /dev/null fi if [ ! -d "${TMPPATH}" ];then mkdir -pv ${TMPPATH} &> /dev/null fi ############################################################################# # 显示错误并退出 ############################################################################# error() { echo "$1" 1>&2 exit 1 } # 检查执行环境 if [ ! -x "$Xtrabackup_FULLPATH" ]; then error "$Xtrabackup未安装或未链接到/usr/bin." fi if [ ! -d $BACKUP_DIR ]; then error "备份目标文件夹:$BACKUP_DIR不存在." fi #第一句的判断不是很准确,可能造成误判 #第二句的lsof在crontab使用时候没有环境变量,需要写全路径,或者加载环境变量 #mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'` if ! /usr/sbin/lsof -n -i:${port} &> /dev/null;then error "MySQL 没有启动运行." fi if ! `echo 'exit' | $MYSQL $MYSQL_CMD -s` ; then error "提供的数据库用户名或密码不正确!" fi # 备份的头部信息 echo "----------------------------" echo echo "$0: MySQL备份脚本" echo "开始于: `date +%F' '%T' '%w`" echo #新建全备目录 mkdir -p $FULLBACKUP_DIR #查找最新的完全备份 LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -iname "202*" -type d -printf "%P\n" | sort -nr | head -1` # 查找最近修改的最新备份时间 LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP` #如果全备有效进行增量备份否则执行完全备份 echo "*********************************" echo -e "正在执行全新的完全备份...请稍等..." echo "*********************************" $Xtrabackup_FULLPATH ${MYSQL_CMD} --backup --parallel=4 --compress --compress-threads=4 --use-memory=2G --target-dir=$FULLBACKUP_DIR > $TMPLOG 2>&1 #保留一份备份的详细日志 cat $TMPLOG>/data/backup/${port}/$logfiledate if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then echo "$INNOBACKUPEX命令执行失败:"; echo echo -e "---------- $Xtrabackup_PATH错误 ----------" cat $TMPLOG rm -f $TMPLOG #exit 1 fi THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\\'" ) ; print p[2] }" $TMPLOG` rm -f $TMPLOG echo -n "数据库成功备份到:$THISBACKUP" # 提示应该保留的备份文件起点 LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -iname "202*" -type d -printf "%P\n" | sort -nr | head -1` RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP} echo "完成于: `date +%F' '%T' '%w`" exit 0 恢复方法 xtrabackup --prepare --target-dir=/dat/20210813111418 #指定好datadir即可,等恢复执行完后使用此datadir目录启动mysql xtrabackup --move-back --target-dir=/dat/20210813111418 --datadir=/dat/mysql80/data5
2024年05月07日
4 阅读
0 评论
0 点赞
2024-05-07
mysql源码编译安装
编译安装 编译参数 cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mysql2 \ -DMYSQL_DATADIR=/opt/mysql2/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DOWNLOADS=1 \ -DDEFAULT_CHARSET=utf8mb4 \ -DWITH_DEBUG=0 \ -DMYSQL_MAINTAINER_MODE=0 \ -DWITH_BOOST=../boost \ -DDEFAULT_COLLAION=utf8mb4_general_ci \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DCMAKE_BUILD_TYPE=mysql_release 最小化编译 cmake .. -DCMAKE_INSTALL_PREFIX=/opt/mysql3 \ -DMYSQL_DATADIR=/opt/mysql3/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DOWNLOADS=1 \ -DDEFAULT_CHARSET=utf8mb4 \ -DWITH_DEBUG=0 \ -DMYSQL_MAINTAINER_MODE=0 \ -DWITH_BOOST=../boost \ -DDEFAULT_COLLAION=utf8mb4_general_ci \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DCMAKE_BUILD_TYPE=MinSizeRel
2024年05月07日
7 阅读
0 评论
0 点赞
2024-05-07
openstack安装vertica的问题
异常问题 在 openstack 上安装vertica的时候出现了几个问题 无法修改io scheduler,/sys/block/sda/queue/scheduler修改后查看仍然是none 出现错误 Error: 'NoneType' object has no attribute 'split',在添加参数 --ignore-install-config 后仍然显示HALT 级别的错误,无法跳过 问题的根本原因: The root of the problem is that if you are installing Vertica on OpenStack it will have a metadata server (169.254.169.254), and if the install python script gets a response from it, it assumes its running under AWS, so it will request AWS specific metadata which doesnt exist, so it gets no response from the OpenStack metadata server. To fix the issue issue you have to edit the aws_metadata.py (/opt/vertica/oss/ python/lib/python2.7/site-ackages/vertica/system/aws_metadata.py) file. Inside the load function (def load, not in the def init) replace the self.is_aws part to self.is_aws = False 在文件中搜索def load后查看最近一行的self.is_aws = XXX ,修改内容为False,然后重新安装 参考链接: https://forum.vertica.com/discussion/235490/vertica-install-on-centos PS: 不知是否可以使用 --ignore-aws-instance-typ 这个参数跳过
2024年05月07日
2 阅读
0 评论
0 点赞
1
...
17
18
19
...
58