mysql 备份账号密码忘了怎么办_mysql数据备份及恢复

备份工具 mysqldump

mysqldump是mysql和mariadb上最好的备份工具之一,免费开源。

mysqldump 首先查询每个数据库和每个表的结构与数据,然后把查出的所有内容导出到文本文件中。它创建的默认的文本文件被称为dump文件,里面包含重建数据库和数据必需的SQL语句。

备份所有数据库

mysqldump --user=admin_backup \

--password=123 --lock-all-tables

--all-databases > /root/all-dbs.sql

--user=admin_back

让mysqldump以admin_back用户与MYSQL服务器交互,应该尽量不用root帐号来备份,因为如果是爱脚本执行的时候需要指定用户名和密码,而且都是明文写在脚本中,这样容易暴露,因此创建一个专有帐户只需要读表和锁表权限更安全。

--password=123

指明备份帐号的密码,交互模式下可以使用--password 后面在弹出需要输入密码的时候再输入密码。

--lock-all-tables

在做备份前,先让mysql锁住所有表,备份完成才解锁,这会有个问题,对于比较繁忙的数据库来说,长时间锁表会有很大影响。应尽量分表分库备份。

--all-databases

导出所有数据库。

备份指定的数据库

mysqldump --user=admin_back --password --lock-tables \

--verbose --databases test > /root/test.sql

--verbose

显示备份详细过程

--databases

后面接数据库的名称,指定备份哪个数据库,如果要备份多个数据库,后面写上多个数据库的名称,并用空格隔开。

备份指定表

mysqldump --user=admin_back --password --lock-tables \

--verbose --databases test --tables user > /root/test-user.sql

--tables

后面接表名,指定要备份的表

创建备份脚本

如果要想自动化备份可以编写脚本列入crontab。如:

#!/bin/bash

# backup mysql use mydqldump tool,and add to crontab

my_user='admin_back'

my_pwd='123'

db1='test1'

db2='test2'

date_today=$(date +%Y-%m-%d-%H:%M:%S)

backup_dir='/data/backup'

dump_file=$db1-$db2-$date-today'.sql'

/usr/bin/mysqldump --user=$my_user --password=$my_pwd --lock-tables --databases $db1 $db2 > $backup_dir$dump_file

加入crontab任务计划

crontab -e -u root

* 1 * * * /root/back_mysql.sh

恢复数据库

mysql --user=admin_backup --password < /root/test.sql

用二进制日志来恢复

使用二进制日志可以做到按时间节点来恢复数据。二进制日志会记录所有执行过的,修改数据的SQL语句。

开启二进制日志

在my.cnf文件[mysqld]部分加入以下语句

[mysqld]

log-bin

binlog-ignore-db=mysql

重启mysql服务器,查看状态

MariaDB [(none)]> show master status;

+----------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+----------------------+----------+--------------+------------------+

| mysql-bin-200.000002 | 2447 | m_s | |

+----------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

查看二进制日志保存位置

MariaDB [(none)]> show variables where variable_name like 'datadir';

+---------------+-----------------+

| Variable_name | Value |

+---------------+-----------------+

| datadir | /var/lib/mysql/ |

+---------------+-----------------+

1 row in set (0.00 sec)

# ls /var/lib/mysql/mysql-bin*

/var/lib/mysql/mysql-bin-200.000001

/var/lib/mysql/mysql-bin-200.000002

/var/lib/mysql/mysql-bin-200.000003

/var/lib/mysql/mysql-bin-200.index

将二进制日志导出

# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 >/root/m_s.txt

# ll /root/m_s.txt

-rw-r--r--. 1 root root 920 Mar 17 13:55 /root/m_s.txt

查看二进制日志内容

# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003

# at 922

#180317 14:58:31 server id 200 end_log_pos 989 Querythread_id=2exec_time=0error_code=0

SET TIMESTAMP=1521269911/*!*/;

BEGIN

/*!*/;

# at 989

#180317 14:58:31 server id 200 end_log_pos 1104 Querythread_id=2exec_time=0error_code=0

SET TIMESTAMP=1521269911/*!*/;

insert into haha (id,name) values(3,"3aaa"),(4,"4bb")

/*!*/;

# at 1104

#180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

其中#开头表示注释

BEGIN和COMMIT中间表示事务

at 后面跟的是pos位置信息

at下面一行表示 执行时间,结束日志位置号

使用二进制恢复实例

查看数据库及表中数据

MariaDB [m_s]> select * from haha;

+----+-----------+

| id | name |

+----+-----------+

| 1 | wangshib |

| 2 | guohuihui |

| 3 | 3aaa |

| 4 | 4bb |

+----+-----------+

4 rows in set (0.00 sec)

先备份数据库

# mysqldump --database m_s --user=root --password --tables haha --flush-logs > /root/mysql/m_s-haha.sql

Enter password:

# ll /root/mysql/m_s-haha.sql

-rw-r--r--. 1 root root 1917 Mar 17 15:29 /root/mysql/m_s-haha.sql

--flush-logs 表示备份时刷新二进制日志

删除表中的行

我们手动把 haha 表中的id为3和4的数据删除

MariaDB [m_s]> delete from haha where id in (3,4);

Query OK, 1 row affected (0.00 sec)

MariaDB [m_s]> select * from haha;

+----+-----------+

| id | name |

+----+-----------+

| 1 | wangshib |

| 2 | guohuihui |

+----+-----------+

3 rows in set (0.00 sec)

从二进制日志中抽取需要恢复的行

先导出二进制日志

先查看一下二进制日志

MariaDB [m_s]> show master logs;

+----------------------+-----------+

| Log_name | File_size |

+----------------------+-----------+

| mysql-bin-200.000001 | 2664 |

| mysql-bin-200.000002 | 2466 |

| mysql-bin-200.000003 | 1178 |

| mysql-bin-200.000004 | 428 |

+----------------------+-----------+

4 rows in set (0.00 sec)

[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003 |grep insert

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

insert into haha (id,name) values('7','aaa')

insert into m_s.haha values(1,"wangshib"),(2,"guohuihui")

insert into haha (id,name) values(3,"3aaa"),(4,"4bb")

[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000004 |grep insert

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

我们看到在mysql-bin-200.000003这个日志中记录了 插入语句(id,3,4),那就把这个二进制日志先导出成为文本文件再抽取出我们需要恢复语句。

# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 > /root/mysql/m_s-haha.txt

[root@master ~]# vi /root/mysql/m_s-haha.txt

...

# at 922

61 #180317 14:58:31 server id 200 end_log_pos 989 Query thread_id=2 exec_time=0 error_code=0

62 SET TIMESTAMP=1521269911/*!*/;

63 BEGIN

64 /*!*/;

65 # at 989

66 #180317 14:58:31 server id 200 end_log_pos 1104 Query thread_id=2 exec_time=0 error_code=0

67 SET TIMESTAMP=1521269911/*!*/;

68 insert into haha (id,name) values(3,"3aaa"),(4,"4bb")

69 /*!*/;

70 # at 1104

71 #180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159

...

这里执行insert id=3的语句开始pos位置为 989 结束于1104

恢复数据

# mysqlbinlog --database=m_s --start-position="989" --stop-position="1104" /var/lib/mysql/mysql-bin-200.000003 | mysql --user=root --password

Enter password:

MariaDB [m_s]> select * from haha;

+----+-----------+

| id | name |

+----+-----------+

| 1 | wangshib |

| 2 | guohuihui |

| 3 | 3aaa |

| 4 | 4bb |

+----+-----------+

4 rows in set (0.00 sec)

这里看到数据已经恢复成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值