这两天自己找资料实现了上面的流程,详细步骤如下:

1. 锁定当前误操作表->改名->解锁

2. 创建新实例,恢复操作在新实例上进行

3. 先还原备份-->恢复备份到误操作之前的业务-->恢复误操作之后的业务

4. 确认恢复之后的表

5. 导入到生产库

1. 确认log_bin是否打开

mysql> show global variables like 'log_bin';

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

| Variable_name | Value |

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

| log_bin       | ON    |

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

root@localhost [(none)]> use test1;

2. 建立测试表

create table t1 (

id int unsigned not null auto_increment,

name char(20) not null,

sex enum('f','m') not null default 'm',

address varchar(30) not null,

primary key(id)

);

insert into t1 (name,sex,address)values('daiiy','m','guangzhou');

insert into t1 (name,sex,address)values('tom','f','shanghai');

insert into t1 (name,sex,address)values('liany','m','beijing');

insert into t1 (name,sex,address)values('lilu','m','zhuhai');

root@localhost [test1]> select * from t1;

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

| id | name  | sex | address |

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

|  1 | daiiy | m   | zhuhai  |

|  2 | tom   | f   | zhuhai  |

|  3 | liany | m   | zhuhai  |

|  4 | lilu  | m   | zhuhai  |

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

3. 清空binglog

reset master;

4. 备份test1数据库

select now();   #2017-06-22 08:42:26

mysqldump -uroot -p3308 --protocol tcp --host 192.168.220.128 --port 3308 --flush-logs --force --databases test1 >test1.dmp #备份指定数据库

mysql -S /home/data/3308/mysql.sock -uroot -p3308 -e "reset master"

5. 模拟备份后的业务操作

5.1 向t1表中添加记录

select now();  #2017-06-22 13:07:29

insert into t1 (name,sex,address)values('111','m','guangzhou');

insert into t1 (name,sex,address)values('222','f','shanghai');

5.2 创建表t2

select now();  #2017-06-22 13:07:56

create table t2 (a int);

insert into t2 values(10),(11),(12),(13),(14),(15);

select * from t2;

5.3 模拟误操作,删除表t1内容

select now();  #2017-06-22 13:08:35

truncate table t1;

5.4 向t2追加记录

select now();  #2017-06-22 13:09:02

insert into t2 values(16),(17),(18),(19),(20);

select * from t2;

5.5 继续向t1表追加记录

select now(); #2017-06-22 13:09:31

insert into t1 (name,sex,address)values('333','m','beijing');

insert into t1 (name,sex,address)values('444','m','zhuhai');

########## 要求恢复表t1以及t1后面新插入的记录

1. 首先LOCK 生产库被truncate的表,禁止所有的操作.

use test1;

lock tables t1 write;

alter table t1 rename to t1_old;

unlock table;

select now();  # 2017-06-22 13:17:26,恢复到这个时间点

2. 创建一个新实例如3308_recover

mkdir /home/data/3309

chown -R mysql:mysql /home/data/3309

cp /home/data/3308/my.cnf /home/data/3309

vi /home/data/3309/my.cnf

:1,$s/3308/3309/g   #把所有3308替换成3309

#log-bin = /home/data/3309/mysql-bin  ##为了加快恢复速度,禁止binlog

运行下面命令进行数据库的初始化:

cd /home/mysql-5.6.35

./scripts/mysql_install_db --defaults-file=/home/data/3309/my.cnf --datadir=/home/data/3309

#修改root密码

kill 启动的mysql  #如果没有启动执行执行下一步

mysqld_safe --defaults-file=/home/data/3309/my.cnf --ledir=/home/mysql-5.6.35/bin --datadir=/home/data/3309 --skip-grant-tables --user=mysql &

mysql -S /home/data/3309/mysql.sock -u root mysql

UPDATE user SET password=PASSWORD("3309") WHERE user='root';

FLUSH PRIVILEGES;

#重启新建实例

mysqladmin -S /home/data/3309/mysql.sock shutdown -u root -p3309

mysqld_safe --defaults-file=/home/data/3309/my.cnf --ledir=/home/mysql-5.6.35/bin --datadir=/home/data/3309 --user=mysql &

#连接实例

mysql -S /home/data/3309/mysql.sock -u root -p3309

#新建一个和误操作的表所在的数据库同名的数据库

CREATE DATABASE test1 /*!40100 DEFAULT CHARACTER SET utf8 */;

3. 将目前的binlog全部复制到一个新位置

cp mysql-bin.0* /tmp

4. 从备份中还原误操作的表

sed -n '/DROP TABLE IF EXISTS `t1`/,/UNLOCK TABLES;/p' test1.dmp > t1.sql  #把要恢复的表从备份文件中取出,如下

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

DROP TABLE IF EXISTS `t1`;

/*!40101 SET @saved_cs_client     = @@character_set_client */;

/*!40101 SET character_set_client = utf8 */;

CREATE TABLE `t1` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`name` char(20) NOT NULL,

`sex` enum('f','m') NOT NULL DEFAULT 'm',

`address` varchar(30) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*!40101 SET character_set_client = @saved_cs_client */;

--

-- Dumping data for table `t1`

--

LOCK TABLES `t1` WRITE;

/*!40000 ALTER TABLE `t1` DISABLE KEYS */;

INSERT INTO `t1` VALUES (1,'daiiy','m','zhuhai'),(2,'tom','f','zhuhai'),(3,'liany','m','zhuhai'),(4,'lilu','m','zhuhai');

/*!40000 ALTER TABLE `t1` ENABLE KEYS */;

UNLOCK TABLES;

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

#### 恢复到新实例中,恢复到这里,t1表应该有4条记录

[root@c12 ~]# mysql -uroot -p3309 -S /home/data/3309/mysql.sock --port 3309 --database test1 < t1.sql

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

| id | name  | sex | address   |

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

|  1 | daiiy | m   | zhuhai    |

|  2 | tom   | f   | zhuhai    |

|  3 | liany | m   | zhuhai    |

|  4 | lilu  | m   | zhuhai    |

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

5. 恢复备份后到truncate前t1表的重做日志

##### 获取备份完成时刻时间

tail -f test1.dmp

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2017-06-22 13:06:04   ★★★★★ 这个时间就是备份后的时间

##### 获得truncate时刻的时间

ls -ltr ../3308

total 176412

drwx------. 2 mysql mysql     4096 Mar  1 13:52 performance_schema

drwx------. 2 mysql mysql     4096 Mar  1 13:52 mysql

-rw-rw----. 1 mysql mysql       56 Mar  1 13:53 auto.cnf

-rw-r--r--. 1 root  root      2454 Apr 11 12:01 my.cnf

drwx------. 2 mysql mysql     4096 May 19 13:28 test

srwxrwxrwx. 1 mysql mysql        0 Jun 20 16:51 mysql.sock

-rw-rw----. 1 mysql mysql        6 Jun 20 16:51 mysql.pid

-rw-rw----. 1 mysql mysql   237361 Jun 22 11:53 mysql_error.log

-rw-rw----. 1 mysql mysql      167 Jun 22 13:06 mysql-bin.000001

-rw-rw----. 1 mysql mysql      167 Jun 22 13:06 mysql-bin.000002  -->误删除时间是13:08:35,可能在这个log中

-rw-rw----. 1 mysql mysql       99 Jun 22 13:06 mysql-bin.index

drwx------. 2 mysql mysql     4096 Jun 22 13:08 test1

drwx------. 2 mysql mysql     4096 Jun 22 13:20 test2

-rw-rw----. 1 mysql mysql     2661 Jun 22 13:20 mysql-bin.000003  -->也可能在这个log中

-rw-rw----. 1 mysql mysql 50331648 Jun 22 13:20 ib_logfile1

-rw-rw----. 1 mysql mysql 79691776 Jun 22 13:20 ibdata1

-rw-rw----. 1 mysql mysql 50331648 Jun 22 13:20 ib_logfile0

##### 查找binlog日志中对应的误操作位置

##### 使用mysqlbinlog将二进制日志转化为明文SQL日志

mysqlbinlog mysql-bin.000002 > /tmp/000002.sql

mysqlbinlog: unknown variable 'default-character-set=gbk'

原因:

[client]下的选项会被所有客户端程序读取(但不包括mysqld),但是mysqlbinlog却不能识别default-character-set,而当客户端不能识别时就会报错并退出,不在继续执行。可以使用loose-variable_name=xxx来解决。

三种解决方法:

1. 修改my.cnf,在[client]下注释或删除default-character-set=gbk;

2. 在命令行中加入--no-defaults开关,使用mysqlbinlog --no-defaults;

3. 将default-character-set=gbk改为(不需重启):

[client]

loose-default-character-set=gbk

这样,所有不能识别该变量的客户端程序(包括mysqlbinlog)都会忽略它,4.0.2以上版本有效;但是执行mysqlbinlog时还是会有以下警告:

Warning: mysqlbinlog: unknown variable 'loose-default-character-set=gbk'

所以上面命令修改如下:

mysqlbinlog --no-defaults /tmp/mysql-bin.000002 > /tmp/000002.sql

### 使用linux的grep命令根据“key word”找到那个引发数据写花的SQL所在的位置

cat /tmp/000002.sql |egrep -C 20 -i 'truncate table `t1`|truncate table t1' --color   #20表示找到行后前后各取20行,没有找到truncate语句

没有找到,用mysql-bin.000003试试

mysqlbinlog --no-defaults /tmp/mysql-bin.000003 > /tmp/000003.sql

cat /tmp/000003.sql |egrep -B 20 -A40 -i 'truncate table `t1`|truncate table t1' --color  #误操作语句前20行,后40行

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

#170622 13:07:56 server id 1  end_log_pos 719 CRC32 0xe64755de  Query   thread_id=19    exec_time=0     error_code=0

SET TIMESTAMP=1498108076/*!*/;

BEGIN

/*!*/;

# at 719

#170622 13:07:56 server id 1  end_log_pos 765 CRC32 0x4b93c93f  Table_map: `test1`.`t2` mapped to number 240

# at 765

#170622 13:07:56 server id 1  end_log_pos 830 CRC32 0x926d9e92  Write_rows: table id 240 flags: STMT_END_F

BINLOG '

rFBLWRMBAAAALgAAAP0CAAAAAPAAAAAAAAEABXRlc3QxAAJ0MgABAwABP8mTSw==

rFBLWR4BAAAAQQAAAD4DAAAAAPAAAAAAAAEAAgAB//4KAAAA/gsAAAD+DAAAAP4NAAAA/g4AAAD+

DwAAAJKebZI=

'/*!*/;

# at 830                        ★★★★★(这个就是误操作语句前一个事务POS)

#170622 13:07:56 server id 1  end_log_pos 861 CRC32 0xa4a7f181  Xid = 4862   ★★★★★第一步就恢复到这里

COMMIT/*!*/;

# at 861                        ★★★★★(这个就是误操作语句发起的POS)

#170622 13:08:35 server id 1  end_log_pos 946 CRC32 0xac5f8a61  Query   thread_id=19    exec_time=1     error_code=0

SET TIMESTAMP=1498108115/*!*/;  ★★★★★(误操作语句发起的时间) select from_unixtime(1498108115);  -> 2017-06-22 13:08:35

truncate table t1               ★★★★★(误操作语句)

/*!*/;

# at 946                        ★★★★★(误操作之后第一个正常语句的POS) 每个事务结束标志是"/*!*/;"

#170622 13:09:02 server id 1  end_log_pos 1019 CRC32 0x31fcff50         Query   thread_id=19    exec_time=0     error_code=0

SET TIMESTAMP=1498108142/*!*/;  ★★★★★(误操作之后第一个正常语句的发出时间) 2017-06-22 13:09:02

BEGIN

/*!*/;

# at 1019

#170622 13:09:02 server id 1  end_log_pos 1065 CRC32 0xd181c1f9         Table_map: `test1`.`t2` mapped to number 240

# at 1065

#170622 13:09:02 server id 1  end_log_pos 1125 CRC32 0xebc98b56         Write_rows: table id 240 flags: STMT_END_F

BINLOG '

7lBLWRMBAAAALgAAACkEAAAAAPAAAAAAAAEABXRlc3QxAAJ0MgABAwAB+cGB0Q==

7lBLWR4BAAAAPAAAAGUEAAAAAPAAAAAAAAEAAgAB//4QAAAA/hEAAAD+EgAAAP4TAAAA/hQAAABW

i8nr

'/*!*/;

# at 1125

#170622 13:09:02 server id 1  end_log_pos 1156 CRC32 0xa837b2d9         Xid = 4869

COMMIT/*!*/;

# at 1156

#170622 13:09:31 server id 1  end_log_pos 1229 CRC32 0x7a350100         Query   thread_id=19    exec_time=0     error_code=0

SET TIMESTAMP=1498108171/*!*/;

BEGIN

/*!*/;

# at 1229

#170622 13:09:31 server id 1  end_log_pos 1284 CRC32 0xce22b81c         Table_map: `test1`.`t1` mapped to number 241

# at 1284

#170622 13:09:31 server id 1  end_log_pos 1337 CRC32 0x5dcd4c30         Write_rows: table id 241 flags: STMT_END_F

BINLOG '

C1FLWRMBAAAANwAAAAQFAAAAAPEAAAAAAAEABXRlc3QxAAJ0MQAEA/7+Dwb+PPcBWgAAHLgizg==

C1FLWR4BAAAANQAAADkFAAAAAPEAAAAAAAEAAgAE//ABAAAAAzMzMwIHYmVpamluZzBMzV0=

'/*!*/;

# at 1337

#170622 13:09:31 server id 1  end_log_pos 1368 CRC32 0x0885b098         Xid = 4872

COMMIT/*!*/;

# at 1368

#170622 13:09:31 server id 1  end_log_pos 1441 CRC32 0xce0af952         Query   thread_id=19    exec_time=0     error_code=0

SET TIMESTAMP=1498108171/*!*/;

BEGIN

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

##### 开始恢复t1表到truncate之前的那一刻

## 导出从备份完成后到truncate之前所有的业务语句

mysqlbinlog --no-defaults --start-datetime='2017-06-22 13:06:04' --stop-datetime='2017-06-22 13:07:56' /tmp/mysql-bin.0* >/tmp/recovery_t1.sql

/*

## 把上面生成的日志中涉及切换数据库的语句替换掉,这样在下一步执行这些SQL语句时使得所有的操作都实在新实例上执行的

sed 's/`test1`/`test2`/g' /tmp/recovery_t1.sql > /tmp/recovery_t1_real.sql

*/

## 在新实例中重新运行这些业务语句,恢复到这里,t1表应该有6条记录

mysql -uroot -p3309 -S /home/data/3309/mysql.sock --port 3309 --force --database test1

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

| id | name  | sex | address   |

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

|  1 | daiiy | m   | guangzhou |

|  2 | tom   | f   | shanghai  |

|  3 | liany | m   | beijing   |

|  4 | lilu  | m   | zhuhai    |

|  5 | 111   | m   | guangzhou |

|  6 | 222   | f   | shanghai  |

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

6. 开始恢复truncate之后第一个正常的SQL直到现在时刻的业务

mysqlbinlog --no-defaults --start-datetime='2017-06-22 13:09:02' --stop-datetime='2017-06-22 13:17:26' /tmp/mysql-bin.0* >/tmp/after_trun.sql

/*

## 把上面生成的日志中涉及切换数据库的语句替换掉,这样在下一步执行这些SQL语句时使得所有的操作都实在新实例上执行的

sed 's/use `test1`//g' /tmp/after_trun.sql > /tmp/after_trun_real.sql

*/

## 在新实例中重新运行这些业务语句,恢复到这里,t1表应该有8条记录

mysql -uroot -p3309 -S /home/data/3309/mysql.sock --port 3309 --force --database test1

ERROR 1146 (42S02) at line 46: Table 'test1.t2' doesn't exist  #由于没有创建其他的表,所以对t1表外的表的语句全部会报错.

ERROR 1062 (23000) at line 64: Duplicate entry '1' for key 'PRIMARY'

ERROR 1062 (23000) at line 81: Duplicate entry '2' for key 'PRIMARY'

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

| id | name  | sex | address   |

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

|  1 | daiiy | m   | zhuhai    |

|  2 | tom   | f   | zhuhai    |

|  3 | liany | m   | zhuhai    |

|  4 | lilu  | m   | zhuhai    |

|  5 | 111   | m   | guangzhou |

|  6 | 222   | f   | shanghai  |

|  1 | 333   | m   | beijing   |

|  2 | 444   | m   | zhuhai    |

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

但是由于自增长字段是主键,所以最后两条记录在恢复时提示,主键冲突错误.如果没有自增长字段应该不会出错.这里的解决方法是

1) 先将目前恢复出的数据表 t1 改名为 t1_1; alter table t1 rename to t1_1;

2) create table t1 as select * from t1_1 where 1=2;

3) 再次执行上面的恢复语句,这时新的t1表应该有2条记录

4) 将t1的记录插入到t1_1,此时的t1_1表应该有8条记录 insert into t1_1(name,sex,address) select name,sex,address from t1;

5) drop table t1; alter table t1_1 rename to t1;

7. 查看表t1_1

select * from t1;

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

| id | name  | sex | address   |

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

|  1 | daiiy | m   | guangzhou |

|  2 | tom   | f   | shanghai  |

|  3 | liany | m   | beijing   |

|  4 | lilu  | m   | zhuhai    |

|  5 | 111   | m   | guangzhou |

|  6 | 222   | f   | shanghai  |

|  7 | 333   | m   | beijing   |

|  8 | 444   | m   | zhuhai    |

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

8. 将恢复出的t1导入到源库中

#从新建实例中导出已恢复的表

mysqldump -S/home/data/3309/mysql.sock -uroot -p3309 --databases test1 --tables t1 > /tmp/t1.sql

#导入到生产库中,由于源表已经改名,所以这里可以直接恢复,如果生产库中的表还有主外键约束,建议先导入到一个其他表,然后确认数据无误后在插入到生产表

mysql -uroot -p3308 -S /home/data/3308/mysql.sock --port 3308 --database test1

后续会逐渐测试一些其他的恢复案例,陆续分享

mysql truncate恢复_求一个恢复truncate或drop table的完整案例相关推荐

  1. C++求一个整数的各位数字总和(附完整源码)

    C++求一个整数的各位数字总和算法 C++求一个整数的各位数字总和算法完整源码(定义,实现,main函数测试) C++求一个整数的各位数字总和算法完整源码(定义,实现,main函数测试) int su ...

  2. vc mysql init 崩溃_故障分析 | 崩溃恢复巨慢原因分析

    作者:xuty 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.现象 有个 MySQL 5.7 开发库异常挂掉后,奔溃恢复一直处于如下位置,且持 ...

  3. mysql数据恢复慢_故障分析 | 崩溃恢复巨慢原因分析

    一.现象 有个 MySQL 5.7 开发库异常挂掉后,奔溃恢复一直处于如下位置,且持续了 2 小时左右才起来.非常疑惑这段时间 MySQL 到底做了什么事情?居然需要这么长时间.虽说这里虚拟机的 IO ...

  4. macos备份恢复_如何在恢复模式下从Time Machine备份中完全还原macOS

    macos备份恢复 If you're installing a new hard drive, or your Mac is completely messed up, you might thin ...

  5. java 最大子数组_求一个数组中子数组的最大和算法(Java实现)

    前几天在微信订阅号"待字闺中"中看到的一篇文章<小技巧求一个数组中子数组的最大和>,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现 ...

  6. python把英语句子成分字母_求一个可以分析英语句子成分的软件或网站

    目前还没有,最好的翻译软件都不能翻译英语语法,只能翻译语法结构简单的句子,更别提专业分析句子成分的软件了:出现专业分析英语句子成分的软件,英语老师应该就失业了. 求一个可以分析英语句子成分的软件或网站 ...

  7. mysql计划任务书_求做一个基于java的mysql课程设计任务书 要求如下

    课程设计任务书一.课程设计的目标使学生综合使用所学过的Java语言程序设计知识,掌握面向对象程序设计的基本思路和方法,利用所学的基本知识和技能,发挥自学能力和查找资料的能力,... 课程设计任务书 一 ...

  8. mysql 强制启动_强制 InnoDB 恢复,启动 MySQL 数据库

    要调查数据库页面损坏,您可以使用从数据库转储表 SELECT ... INTO OUTFILE.通常,以这种方式获得的大多数数据是完整的.严重损坏可能导致语句或 后台操作崩溃或断言,甚至导致前滚恢复崩 ...

  9. 织梦mysql占用资源_解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记

    早上帮朋友一台服务器解决了Mysql cpu 占用 100%的问题.稍整理了一下: 朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysq ...

最新文章

  1. linux下的软硬资源限制,关于ulimit命令修改软硬资源大小说明及正确修改软硬资源限制数配置...
  2. Exchange Server 2007 移动邮件
  3. java中的数据库事务处理
  4. python的mysql模块_python使用MySQLdb模块连接MySQL
  5. occam‘s razor
  6. 冬至日,诚邀你来杭州网易,一起吃着饺子畅聊「B2B增长」
  7. C# == 和equals()区别
  8. 在 Microsoft word中插入代码
  9. 计算机中 amp 是什么符号,这里面的amp;amp;,||是什么意思,相当与数学里面的什么符号?...
  10. 数字化转型太太太难?AI、IoT 重拳出击!
  11. 20155226实验四
  12. Java程序员如何写好一份个人求职简历
  13. 从零开始学Java【基本输入输出、排序(sort)、高精度大数运算(BigInteger)】
  14. 基于五种机器算法的信用风险评估
  15. 面试了一位-46-岁的程序员,思绪万千,最后结局竟让我大惊失色
  16. python---字符串函数
  17. 北京内推 | 华为诺亚方舟实验室招聘自动驾驶仿真实习生
  18. 视频素材网,视频剪辑必备。
  19. 致远SPM之协同供应链集成解决方案
  20. 国密加密解密之vue-sm2使用

热门文章

  1. python里面pow是什么意思_python中pow是什么意思
  2. Android获取AP热点IP,获取连接到本机AP热点设备的IP地址
  3. privat,pubic的区别
  4. 计算机休眠密码,启用或停用Windows 10睡眠唤醒密码的方法
  5. IDEA集成leetcode
  6. 哈斯HASS数控系统CNC数据采集
  7. 未来计算机结构图,青科看未来——计算机体系结构的新黄金时代 | YEF2021大会论坛...
  8. ZJU夏令营面试记录
  9. opencv HSV色彩空间 追踪特定颜色
  10. 完美安装BatteryHistorian-Note: Could not parse aggregated battery stats.