zoukankan      html  css  js  c++  java
  • Mysql

    一、概述

    如果linux操作系统宕机,启动不了,救援模式(rescue installed system)也行不通的时候,那么该机器上的mysql数据还能恢复吗?如果能,怎么恢复呢,带着这个问题做个实验。
     

    二、环境介绍

    准备两台虚拟机,虚拟机软件为virtualbox
    ip 192.168.56.81 该虚拟机上面运行了mysql,后面模拟这个机器奔溃,然后将mysql数据抢救回来
     
    81上的文件
    1.png
     
    81上的mysql数据库
    2.png
     
    ip 192.168.56.71 该虚拟机为新机器,后面需要将81上的数据库迁移到71这个机器上
     

    三、开始实验

    删除81机器上的/boot目录文件,然后强制重启
    3.png
     
    这时候系统就启动失败,报error: file '/grup2/i386-pc/normal.mod' not found.
    4.png
     
    关闭故障虚拟机81,选择强制退出
    5.png
     
    将故障虚拟机81的硬盘挂载到新的虚拟机71上,启动新的虚拟机71
    图片6.png
     
    通过lsblk能看到sdb就是新挂载的磁盘
    7.1.png
     
    建立挂载点,挂载新的磁盘,提示mount: unknown filesystem type 'LVM2_member'

    [root@oracletest ~]# mkdir /newmnt
    [root@oracletest ~]# mount /dev/sdb2 /newmnt
    mount: unknown filesystem type 'LVM2_member'
    

    这是因为/dev/sdb2是一个物理卷,不能直接挂载,需要挂载该物理卷对应的逻辑卷
    查看逻辑卷(这个可能需要等一会才查看得到),可以看到LV Status为NOT available
    8.png
     
    使用vgchange -ay /dev/vg激活逻辑卷组(vg是逻辑卷组名字),可以看到LV Status为available
    9.png
     
    挂载逻辑卷,可以看到文件已经找回来了

    [root@oracletest ~]# mount /dev/vg/lvroot /newmnt
    [root@oracletest ~]# cd /newmnt
    [root@oracletest newmnt]# ls
    bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@oracletest newmnt]# cd /newmnt/root
    [root@oracletest root]# ls
    important.txt  install.sh  mysql-8.0.22-linux-glibc2.12-x86_64.tar.xz
    [root@oracletest root]# cat important.txt 
    this is important text!
    

    接下来是恢复mysql数据库,原理很简单,跟迁移mysql没区别,就是将原mysql文件迁移到新的目录,然后起库

     
    首先在新的虚拟机71上面安装跟故障虚拟机中相同版本的mysql(安装过程略)
     
    查看原mysql的参数文件,确定mysql日志文件和数据文件的目录

    [root@oracletest root]# cat /newmnt/etc/my.cnf
    [mysqld]
    # basic settings #
    ...
    basedir = /usr/local/mysql
    datadir = /opt/mydata/data
    tmpdir = /opt/mydata/tmp
    log_bin = /opt/mydata/log/binlog/binlog
    ...
    

     
    查看原mysql的数据文件

    [root@oracletest root]# cd /newmnt/opt/mydata/
    [root@oracletest mydata]# ll
    total 12
    drwxr-xr-x 6 995 1000 4096 Feb 11 14:03 data
    drwxr-xr-x 4 995 1000 4096 Feb 11 14:03 log
    drwxr-xr-x 2 995 1000 4096 Feb 11 14:03 tmp
    

     
    创建相关目录

    mkdir -p /opt/mydata/data
    mkdir -p /opt/mydata/tmp
    mkdir -p /opt/mydata/log/binlog
    chown -R mysql:mysql /opt/mydata
    

     
    拷贝mysql文件到对应的目录

    cp -r /newmnt/etc/my.cnf /etc
    cp -r /newmnt/opt/mydata/data /opt/mydata/
    cp -r /newmnt/opt/mydata/log/binlog /opt/mydata/log/
    chown -R mysql:mysql /opt/mydata # 这一步的目的是由于原始文件在挂到新的机器上时所属用户和所属组会丢失,需要重新更改成mysql组
    

     
    启动mysql

    [root@oracletest ~]# service mysql start
    Starting MySQL.2021-04-08T11:39:26.437943Z mysqld_safe error: log-error set to '/opt/mydata/log/error.log', however file don't exists. Create writable for user 'mysql'.
    The server quit without updating PID file (/opt/mydata/data[FAILED]est.pid).
    

     
    报错,说没有error.log,那就创建一个,再启动mysql

    [root@oracletest ~]# touch /opt/mydata/log/error.log
    [root@oracletest ~]# chown -R mysql:mysql /opt/mydata/log/error.log
    [root@oracletest ~]# service mysql start
    Starting MySQL..      [  OK  ]
    

     
    可以看到数据库的表也找回来了
    10.png
     

    四、总结

    1. 只要没有删除数据库的数据文件,即使系统起不来了,我们仍然可以将系统的盘拆下来挂到新的机器上,将数据拷贝出来
    2. 养成备份的习惯,正式、仿真、开发、测试环境都需要,除非这个库完全丢了也无所谓
  • 相关阅读:
    各种sensor名称统计
    数组指针和指针数组的区别
    自己写一个线程池
    git命令总结
    用链表实现队列的功能
    一个free的问题
    生产者消费者问题--进阶2
    影响架构决策的非功能性需求
    从商业角度探讨API设计
    给公司部门设计的SOA架构
  • 原文地址:https://www.cnblogs.com/ddzj01/p/14636251.html
Copyright © 2011-2022 走看看