xtrabackup三种备份和还原(一)
写这边博客心情不是太美好(博客已经停更2个多月了,实在是没心情学习新东西。2018我的黑暗年,呵呵)好了,不废话了,本文没有任何原理的部分,我也是刚开始接触xtrabackup这个工具。本文应该是一个系列,包括测试环境安装,配置,测试步骤,形成脚本等等,如果我还有激情,可能会找一些原理的部分好好理解一下。这个工具确实很强大。
一、安装测试环境
1 环境准备
[root@mysql test01]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) [root@mysql test01]# mysql --version
mysql Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using EditLine wrapper
# 你没看错,是mysql,不是mariadb
2 安装配置
# 1、安装测试mysql-server 5.7 # clean mariadb env
yum remove mariadb-* -y # install mysql-5.7
cd /root/mysql/resource
yum install *.rpm # edit config
echo 'yes' | cp /etc/my.cnf /etc/my.cnf.bak
cat >/etc/my.cnf <<EOF
[mysqld]
#skip-grant-tables
innodb_file_per_table=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
user=mysql
binlog_format=ROW
max_connections = 4096
bind-address= 0.0.0.0 default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M log-bin=mysql-bin
server-id=1
slow_query_log = ON
slow_query_log_file = /var/log/slow.log
long_query_time = 1 EOF systemctl start mysqld
systemctl enable mysqld # 2、安装配置xtrabackup工具
yum install percona-xtrabackup-24-2.4.6-2.el7.x86_64.rpm -y
下载mysql-5.7.23
mkdir /opt/mysql-5.7.23/ -p
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-server-5.7.23-1.el7.x86_64.rpm
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-client-5.7.23-1.el7.x86_64.rpm
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-devel-5.7.23-1.el7.x86_64.rpm
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-5.7.23-1.el7.x86_64.rpm
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm
wget -P /opt/mysql-5.7.23/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-common-5.7.23-1.el7.x86_64.rpm
下载xtrabackup工具
mkdir -p /opt/xtrabackup/
wget -P /opt/xtrabackup/ https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.6/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.6-2.el7.x86_64.rpm
安装测试 so easy
二、备份和还原吧
我们这里测试6种场景,当然应该不止这6种场景,备份全库和还原全库、备份全库和还原指定库、备份指定库还原指定库、备份全库还原指定表、备份指定库还原指定表、增量备份的一些测试与脚本思考
1 备份全库和还原全库
# 创建测试数据
create database test01 default charset utf8;
use test01;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); create database test02 default charset utf8;
use test02;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); # 1. 完全备份 # 创建存放目录
mkdir -pv /opt/test01 # 进行数据库全备
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 /opt/test01 # 2. 数据被破坏了
drop database test01;
drop database test02; # 3. 还原数据
# 停止数据库
systemctl stop mysqld # prepare
innobackupex --apply-log /opt/test01/2018-08-20_18-15-18/ # 保证mysql数据目录为空
mkdir -p /opt/mysql_data
mv /var/lib/mysql/* /opt/mysql_data # 还原
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /opt/test01/2018-08-20_18-15-18/ chown -R mysql.mysql /var/lib/mysql systemctl start mysqld
1.2 增量备份来一波
# 1. 创建测试数据
create database test01 default charset utf8;
use test01;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create database test02 default charset utf8;
use test02;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); #2. 全量备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp /opt/test01/test_full
# 增量备份1 ( 以全备为基准:/opt/test01/test_full )
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --incremental /opt/test01/inc01 --incremental-basedir=/opt/test01/test_full/ --parallel=2 # 再往 A 里插入数据:
insert into A values (201,'aaa'),(202,'bbb'),(203,'ccc'),(326,'zzz'); # 增量备份2:( 以增量1为基准:/opt/test01/inc01/2018-08-20_11-16-17 )
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --incremental /opt/test01/inc02 --incremental-basedir=/opt/test01/inc01/2018-08-20_11-16-17/ --parallel=2 # 3. 还原
#增量备份的恢复 #增量备份的恢复需要有3个步骤 # 1、恢复完全备份
# 2、恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份要去掉--redo-only)
# 3、对整体的完全备份进行恢复,回滚未提交的数据 具体步骤:
# 准备一个全备
innobackupex --apply-log --redo-only /opt/test01/test_full/ #将增量1应用到完全备份
innobackupex --apply-log --redo-only /opt/test01/test_full/ --incremental-dir=/opt/test01/inc01/2018-08-20_11-16-17/ #将增量2应用到完全备份,注意不加 --redo-only 参数了
innobackupex --apply-log /opt/test01/test_full/ --incremental-dir=/opt/test01/inc02/2018-08-20_11-17-00/ #把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据#
innobackupex --apply-log /opt/test01/test_full/ # 模拟测试:
drop table A; systemctl stop mysqld
# 保证mysql数据目录为空
mv /var/lib/mysql/* /opt/mysql/
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /opt/test01/test_full/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld #数据已经恢复
select * from A;
2 备份全库和还原指定库
# 1. 准备测试数据
create database test01 default charset utf8;
use test01;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); create database test02 default charset utf8;
use test02;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); # 1、备份全库
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp /opt/test01/test_full # 2、破坏数据
drop database test01;
drop database test02; # 3. 只还原test01库
innobackupex --apply-log /opt/test01/test_full # 手工删除
systemctl stop mysqld
cd /var/lib/mysql
# 这里最好不好删除,而是备份。防止出问题
rm -rf test01 test02 ibdata1
# 2).copy,因为是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)
cd /opt/test01/test_full
cp -r test01 /var/lib/mysql
cp ibdata1 /var/lib/mysql
# 3).改权限
chown -R mysql.mysql /var/lib/mysql systemctl start mysqld
3 备份指定库和还原指定库
可能会觉得这个和2有些重复,但是我们想如果我们有一个主数据库(里面有2个库)是1T的数据文件,三个从库分别只有主数据库的一个库。且三个库大小不一致,比如一个1G,一个2G,一个998G,这个很夸张,但是确实有可能存在。这个时候我们只想还原其中一个从数据库的库。就用到这种场景了。
# 1. 准备测试数据
create database test01 default charset utf8;
use test01;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create database test02 default charset utf8;
use test02;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); # 1、备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="test01" /opt/test01/test01 # 测试删除库
mysql -uroot -proot1234
# drop database test01;
create table C(id int,name varchar(10))engine=innodb;
insert into C values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); # 2、还原
innobackupex --apply-log /opt/test01/test01 # 手工删除
systemctl stop mysqld
cd /var/lib/mysql
# 这里最好不好删除,而是备份。防止出问题
rm -rf test01 ibdata1
# 2).copy,因为是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)
cd /opt/test01/test01
cp -r test01 /var/lib/mysql
cp ibdata1 /var/lib/mysql
# 3).改权限
chown -R mysql.mysql /var/lib/mysql systemctl start mysqld
3.1 增量来一波
# 1. 增量备份与恢复
# 我们以之前做的全备为基准,在其基础上做增量备份:
# 在test01数据库上新建一张表,并插入数据作为增量
mysql -uroot -proot1234
use test01
create table tb2 (id int,name varchar(40));
insert into tb2 values (1,'aaa'),(2,'bbb'),(3,'ccc'),(26,'zzz'); # 全备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="test01" /opt/test01/test01_full/ # 增量备份1 ( 以全备为基准:/opt/test01/test01_full/ )
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="test01" --incremental /opt/test01/test01_inc01/ --incremental-basedir=/opt/test01/test01_full/ --parallel=2 # 再往 tb2 里插入数据:
insert into tb2 values (201,'aaa'),(202,'bbb'),(203,'ccc'),(326,'zzz'); # 增量备份2:( 以增量1为基准:/opt/test01/test01_inc01/ )
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="test01" --incremental /opt/test01/test01_inc02/ --incremental-basedir=/opt/test01/test01_inc01/ --parallel=2 #增量备份的恢复 #增量备份的恢复需要有3个步骤 # 1、恢复完全备份
# 2、恢复增量备份到完全备份(开始恢复的增量备份要添加--redo-only参数,到最后一次增量备份要去掉--redo-only)
# 3、对整体的完全备份进行恢复,回滚未提交的数据 具体步骤:
# 准备一个全备
innobackupex --apply-log --redo-only /opt/test01/test01_full/ #将增量1应用到完全备份
innobackupex --apply-log --redo-only /opt/test01/test01_full/ --incremental-dir=/opt/test01/test01_inc01/ #将增量2应用到完全备份,注意不加 --redo-only 参数了
innobackupex --apply-log /opt/test01/test01_full/ --incremental-dir=/opt/test01/test01_inc02/ #把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据#
innobackupex --apply-log /opt/test01/test01_full/ # 模拟测试:
drop table tb2; # 手工删除
systemctl stop mysqld
cd /var/lib/mysql
# 这里最好不好删除,而是备份。防止出问题
rm -rf test01 ibdata1
# 2).copy,因为是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)
cd /opt/test01/test01_full/
cp -r test01 /var/lib/mysql
cp ibdata1 /var/lib/mysql
# 3).改权限
chown -R mysql.mysql /var/lib/mysql systemctl start mysqld #数据已经恢复
select * from tb2; # 最终恢复到 增量备份2的那个状态
4 指定单表进行备份与还原
# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="dba_test.A xtra_test.M" /home/wanstack/xtrabackup/backup02/
# 我们很可能是全量备份,加上增量备份的备份策略,如果仅仅只是恢复某张表从而进行恢复多个数据库全量备份恢复,再加上 N 个增量的恢复,
# 上百 G 甚至上 T 的数据,在等数据恢复、拷贝数据库、追同步完成的过程中,估计你后面已经站满了领导/(ㄒoㄒ)/~~
# 本文主要介绍利用 XtraBackup 备份工具来实现单表快速恢复,在紧急数据恢复场景下,用最短的时间来恢复数据,最大程度降低损失。
# 在 MySQL 5.6 之前,对基于 InnoDB 存储引擎的表,即便开启 innodb_file_per_table 选项,也是无法通过复制数据文件来达到在不同实例之间复制表的目的的。 # 从mysql 5.6版本开始,支持可移动表空间(Transportable Tablespace),利用这个功能也可以实现单表的恢复,下面进行从备份中恢复单张innodb表进行演练。 """
1. 针对InnoDB表恢复 2. 开启了参数innodb_file_per_table 3. 安装工具:mysql-utilities,其中mysqlfrm可以读取表结构。
""" # 1、工具安装
yum install mysql-utilities -y # 2 创建测试数据
create database test01 default charset utf8;
use test01;
create table A(id int,name varchar(10))engine=innodb;
insert into A values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E');
create table B(id int,name varchar(10))engine=innodb;
insert into B values(11,'A'),(22,'B'),(33,'C'),(44,'D'),(55,'E'); # 3 进行xtrabackup备份操作:
innobackupex --defaults-file='/etc/my.cnf' --user='root' --password='root1234' --no-timestamp /opt/test01/test01_full/ # apply-log
innobackupex --defaults-file='/etc/my.cnf' --user='root' --password='root1234' --apply-log /opt/test01/test01_full/ # 进行完整备份后,我们继续往测试表A表里插入数据,尽量模拟线上环境:
insert into A values(10,'A'),(20,'B'),(30,'C'),(40,'D'),(50,'E');
"""
# 插入前
mysql> select * from A;
+------+------+
| id | name |
+------+------+
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
+------+------+
10 rows in set (0.00 sec) mysql> insert into A values(10,'A'),(20,'B'),(30,'C'),(40,'D'),(50,'E');
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: test01 Query OK, 5 rows affected (0.06 sec)
Records: 5 Duplicates: 0 Warnings: 0
# 插入后
mysql> select * from A;
+------+------+
| id | name |
+------+------+
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
| 10 | A |
| 20 | B |
| 30 | C |
| 40 | D |
| 50 | E |
+------+------+
15 rows in set (0.00 sec)
"""
# xtrabackup备份里只有5条数据,备份后的数据,我们一会使用binlog来进行恢复。 # 进行误操操作,把表drop了:
drop table A; # 使用mysqlfrm从备份中读取表结构:
[root@mysql test01]# mysqlfrm --diagnostic /opt/test01/test01_full/test01/A.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for /opt/test01/test01_full/test01/A.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement: CREATE TABLE `test01`.`A` (
`id` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB; #...done. # 登录数据库进行建表:
mysql -uroot -proot1234
CREATE TABLE `test01`.`A` (
`id` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB; # 加一个写锁,确保安全:
lock tables A write;
#丢弃表空间:
alter table A discard tablespace;
# 从备份中拷贝ibd文件,并且修改权限:
cp /opt/test01/test01_full/test01/A.ibd /var/lib/mysql/test01/
chown -R mysql:mysql /var/lib/mysql/test01/
# 载入表空间:
alter table A import tablespace;
show warnings;
select * from A;
unlock tables;
"""
mysql> show warnings;
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory) Error opening './test01/A.cfg', will attempt to import without schema verification |
+---------+------+------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) mysql> select * from A;
+------+------+
| id | name |
+------+------+
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
| 11 | A |
| 22 | B |
| 33 | C |
| 44 | D |
| 55 | E |
+------+------+
10 rows in set (0.01 sec)
"""
你以为还原表完了吗?没有哦这个待续吧。
5 指定库备份还原续
# 很抱歉,如果您按照上面的步骤还原是没办法还原存储过程,函数等等信息的。需要使用如下方式
# 1、备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=root1234 --no-timestamp --databases="test01" /opt/test01/test01 # 测试删除库
mysql -uroot -proot1234
drop database test01; # 2、还原
innobackupex --apply-log /opt/test01/test01 mv /var/lib/mysql/ib_logfile* ../mysql_bak02
mv /var/lib/mysql/ibdata1 ../mysql_bak02
mv /var/lib/mysql/test01 ../mysql_bak02 mv /var/lib/mysql/* ../mysql_bak
innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/test01/test01 mv ../mysql_bak ../mysql
chown -R mysql:mysql /var/lib/mysql service mysql start
xtrabackup三种备份和还原(一)的更多相关文章
- MySQL三种备份
一)备份分类 1 2 3 4 5 6 7 8 9 10 11 12 冷备:cold backup数据必须下线后备份 温备:warm backup全局施加共享锁,只能读,不能写 热备:hot backu ...
- 【转】Mysql三种备份详解
一.备份的目的 做灾难恢复:对损坏的数据进行恢复和还原需求改变:因需求改变而需要把数据还原到改变以前测试:测试新功能是否可用 二.备份需要考虑的问题 可以容忍丢失多长时间的数据:恢复数据要在多长时间内 ...
- mysql三种备份方式
一.备份的目的 做灾难恢复:对损坏的数据进行恢复和还原需求改变:因需求改变而需要把数据还原到改变以前测试:测试新功能是否可用 二.备份需要考虑的问题 可以容忍丢失多长时间的数据:恢复数据要在多长时间内 ...
- Oracle数据库三种备份方案
Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份.导出备件是一种逻辑备份,冷备份和热备份是物理备份. 一. 导出/导入(Export/Import) 利用 ...
- Linux下SVN的三种备份方式
原文链接:http://blog.csdn.net/windone0109/article/details/4040772 (本文例子基于FreeBSD/Linux实现,windows环境请自己做出相 ...
- xtrabackup 安装、备份、还原及错误处理 教程
xtrabackup 是MYSQL的一个备份软件 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个 ...
- mysql数据库-备份与还原-Percona XtraBackup 2.4备份工具使用
目录 xtrabackup 特点 备份生成的相关文件 xtrabackup 安装 xtrabackup 用法 1 备份 2 预备份 3 还原 4 其他 还原注意事项 xtrabackup实现完全备份及 ...
- mysql 三种恢复方式
为了保障数据的安全,需要定期对数据进行备份.备份的方式有很多种,效果也不一样.一旦数据库中的数据出现了错误,就需要使用备份好的数据进行还原恢复.从而将损失降到最低.下面我们来了解一下MySQL常见的有 ...
- SQL Server 2008数据备份与还原的原理是什么?
为什么SqlServer有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的SqlServer数据 ...
随机推荐
- Oracle HA 之ADVM和ACFS
--ADVM ADVM主要是为了使除了数据库之外的第三方应用程序也可以使用asm存储,这样不限于使asm局限于自家的数据库领域.要想使用ADVM首先必须安装grid,已经创建好了asm磁盘,asm磁盘 ...
- Java中参数传递时值传递的机制分析
参数传递是什么? 在C的函数或是JAVA的方法中,向一个函数或方法内部传递一个参数,比如: void fun( int num ){ num+=2 ; } int a = 3 ...
- Windows mysql默认字符集修改
一.通过MySQL命令行修改: set character_set_client=utf8; set character_set_connection=utf8; set character_set_ ...
- 基于 Spark 的文本情感分析
转载自:https://www.ibm.com/developerworks/cn/cognitive/library/cc-1606-spark-seniment-analysis/index.ht ...
- scikit-learn 中常用的评估模型
一,scikit-learn中常用的评估模型 1.评估分类模型: 2.评估回归模型: 二.常见模型评估解析: •对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:(T,F表示预测的 ...
- cocos代码研究(13)Widget子类EditBox学习笔记
理论基础 一个用来输入文本的类,继承自 Widget , 以及 IMEDelegate. 代码部分 Public枚举类型 enum KeyboardReturnType键盘的返回键类型. enum I ...
- 牛客国庆集训派对Day6 Solution
A Birthday 思路:设置一个源点,一个汇点,每次对$源点对a_i, b_i , a_i 对 b_i 连一条流为1,费用为0的边$ 每个点都再连一条 1, 3, 5, 7, ....的边到 ...
- 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution
A - Odd Palindrome 水. #include <bits/stdc++.h> using namespace std; #define N 110 char s[N]; i ...
- Java中使用OpenSSL生成的RSA公私钥进行数据加解密
当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一.使用OpenSSL来生成私钥和公钥 1.执行命令openssl version -a 验证机器上已经安装openssl 1 open ...
- linux内核分析第三周-跟踪分析Linux内核的启动过程
一.实验流程 1.打开环境 执行命令:cd LinuxKernel/ 执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...