Percona-Tookit工具包之pt-online-schema-change
###Commonly used parameter introduce.###
connect parameter:
-h hostname -P port -u username -p password -S socket output parameter:
--print -- Show whole procedure of ddl operation on the screen. main parameter:
--alter -- Specify the ddl statement using quotation mark behind. alternative parameter:
--dry-run -- Only operate the new table instead of original one.
--execute -- Directly do all opertion both new and original table. other parameter:
--no-check-alter -- Don't parse your ddl statment which follows behind.
--ask-pass -- You cannot use -p without a string to input password,so you need this parameter. ###Create test table.###
(root@localhost mysql3306.sock)[zlm]::>create table test_ddl(
-> id int unsigned auto_increment,
-> name varchar() not null default '',
-> tel tinyint unsigned not null default ,
-> primary key(id)
-> ) engine=innodb charset=utf8mb4;
Query OK, rows affected (0.01 sec) ###Insert records into table.###
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',);
ERROR (): Out of range value for column 'tel' at row
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',);
ERROR (): Out of range value for column 'tel' at row
(root@localhost mysql3306.sock)[zlm]::>insert into test_ddl(name,tel) values('zlm',); -- Scope of unsigned tinyint is ~.
Query OK, row affected (0.00 sec) (root@localhost mysql3306.sock)[zlm]::>select * from test_ddl;
+----+------+-----+
| id | name | tel |
+----+------+-----+
| | zlm | |
+----+------+-----+
row in set (0.00 sec) ###Change column "tel" from tinyint to bigint.###
[root@zlm2 :: ~]
#pt-online-schema-change -hzlm2 -P3306 -uroot --ask-pass --alter "modify tel bigint default 0" --print --execute --no-check-alter D=zlm,t=test_ddl
Enter MySQL password: ###Check slave information.###
No slaves found. See --recursion-method if host zlm2 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified. ###Summary of operations.###
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zlm`.`test_ddl`... ###Create new table.###
Creating new table...
CREATE TABLE `zlm`.`_test_ddl_new` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` tinyint() unsigned NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4
Created new table zlm._test_ddl_new OK. ###Alter column in new table.###
Altering new table...
ALTER TABLE `zlm`.`_test_ddl_new` modify tel bigint default
Altered `zlm`.`_test_ddl_new` OK. -- If you specify "dry-run",it will end here. ###Create Triggers.###
--20T10:: Creating triggers...
--20T10:: Created triggers OK. ###Copy rows into new table.###
--20T10:: Copying approximately rows...
INSERT LOW_PRIORITY IGNORE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*pt-online-schema-change 4190 copy table*/
--20T10:: Copied rows OK. ###Swap oraiginal table with new table.###
--20T10:: Analyzing new table...
--20T10:: Swapping tables...
RENAME TABLE `zlm`.`test_ddl` TO `zlm`.`_test_ddl_old`, `zlm`.`_test_ddl_new` TO `zlm`.`test_ddl`
--20T10:: Swapped original and new tables OK. ###Drop original table.###
--20T10:: Dropping old table...
DROP TABLE IF EXISTS `zlm`.`_test_ddl_old`
--20T10:: Dropped old table `zlm`.`_test_ddl_old` OK. ###Drop triggers.###
--20T10:: Dropping triggers...
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_del`
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_upd`
DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_ins`
--20T10:: Dropped triggers OK.
Successfully altered `zlm`.`test_ddl`. ###Check table ddl.###
(root@localhost mysql3306.sock)[zlm]::>show create table test_ddl;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_ddl | CREATE TABLE `test_ddl` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` bigint() DEFAULT '', -- The column "tel" has be changed into bigint type now.
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4 |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
row in set (0.01 sec) ###Check general log file for detail.###
[root@zlm2 :: /data/mysql/mysql3306/data]
#cat zlm2.log mysqld, Version: 5.7.-log (MySQL Community Server (GPL)). started with:
Tcp port: Unix socket: /tmp/mysql3306.sock
Time Id Command Argument
--20T08::.476403Z Query show global variables like '%general_log%'
--20T08::.828985Z Connect root@localhost on zlm using TCP/IP
--20T08::.829297Z Query SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'
--20T08::.832850Z Query SET SESSION innodb_lock_wait_timeout=
--20T08::.833041Z Query SHOW VARIABLES LIKE 'lock\_wait_timeout'
--20T08::.836907Z Query SET SESSION lock_wait_timeout=
--20T08::.837752Z Query SHOW VARIABLES LIKE 'wait\_timeout'
--20T08::.842090Z Query SET SESSION wait_timeout=
--20T08::.842222Z Query SELECT @@SQL_MODE
--20T08::.842350Z Query SET @@SQL_QUOTE_SHOW_CREATE = /*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
--20T08::.842453Z Query SELECT @@server_id /*!50038 , @@hostname*/
--20T08::.843311Z Connect root@localhost on zlm using TCP/IP
--20T08::.843620Z Query SHOW VARIABLES LIKE 'innodb\_lock_wait_timeout'
--20T08::.847069Z Query SET SESSION innodb_lock_wait_timeout=
--20T08::.847442Z Query SHOW VARIABLES LIKE 'lock\_wait_timeout'
--20T08::.851645Z Query SET SESSION lock_wait_timeout=
--20T08::.851904Z Query SHOW VARIABLES LIKE 'wait\_timeout'
--20T08::.853942Z Query SET SESSION wait_timeout=
--20T08::.854029Z Query SELECT @@SQL_MODE
--20T08::.854055Z Query SET @@SQL_QUOTE_SHOW_CREATE = /*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
--20T08::.854152Z Query SELECT @@server_id /*!50038 , @@hostname*/
--20T08::.854356Z Query SHOW VARIABLES LIKE 'wsrep_on'
--20T08::.857148Z Query SHOW VARIABLES LIKE 'version%'
--20T08::.860325Z Query SHOW ENGINES
--20T08::.861002Z Query SHOW VARIABLES LIKE 'innodb_version'
--20T08::.864957Z Query SHOW VARIABLES LIKE 'innodb_stats_persistent'
--20T08::.867873Z Query SELECT @@SERVER_ID
--20T08::.868114Z Query SHOW GRANTS FOR CURRENT_USER()
--20T08::.868774Z Query SHOW FULL PROCESSLIST
--20T08::.869245Z Query SHOW SLAVE HOSTS
--20T08::.869849Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.874152Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.877509Z Query SELECT CONCAT(@@hostname, @@port)
--20T08::.877973Z Query SHOW TABLES FROM `zlm` LIKE 'test\_ddl'
--20T08::.878229Z Query SELECT VERSION()
--20T08::.879011Z Query SHOW TRIGGERS FROM `zlm` LIKE 'test\_ddl'
--20T08::.879506Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.879602Z Query USE `zlm`
--20T08::.879706Z Query SHOW CREATE TABLE `zlm`.`test_ddl`
--20T08::.880123Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.880979Z Query EXPLAIN SELECT * FROM `zlm`.`test_ddl` WHERE =
--20T08::.881846Z Query SELECT table_schema, table_name FROM information_schema.key_column_usage WHERE referenced_table_schema='zlm' AND referenced_table_name='test_ddl'
--20T08::.893011Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.893622Z Query USE `zlm`
--20T08::.893798Z Query SHOW CREATE TABLE `zlm`.`test_ddl`
--20T08::.893954Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.894730Z Query CREATE TABLE `zlm`.`_test_ddl_new` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`name` varchar() NOT NULL DEFAULT '',
`tel` int() DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4
--20T08::.914358Z Query ALTER TABLE `zlm`.`_test_ddl_new` modify tel bigint default
--20T08::.934771Z Query /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
--20T08::.934930Z Query USE `zlm`
--20T08::.935044Z Query SHOW CREATE TABLE `zlm`.`_test_ddl_new`
--20T08::.936057Z Query /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
--20T08::.936926Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'DELETE' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.937687Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'UPDATE' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.939328Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'INSERT' AND ACTION_TIMING = 'AFTER' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.940991Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'DELETE' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.942390Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'UPDATE' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.943844Z Query SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_MANIPULATION = 'INSERT' AND ACTION_TIMING = 'BEFORE' AND TRIGGER_SCHEMA = 'zlm' AND EVENT_OBJECT_TABLE = 'test_ddl'
--20T08::.944624Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_del` AFTER DELETE ON `zlm`.`test_ddl` FOR EACH ROW DELETE IGNORE FROM `zlm`.`_test_ddl_new` WHERE `zlm`.`_test_ddl_new`.`id` <=> OLD.`id`
--20T08::.949413Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_upd` AFTER UPDATE ON `zlm`.`test_ddl` FOR EACH ROW BEGIN DELETE IGNORE FROM `zlm`.`_test_ddl_new` WHERE !(OLD.`id` <=> NEW.`id`) AND `zlm`.`_test_ddl_new`.`id` <=> OLD.`id`;REPLACE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) VALUES (NEW.`id`, NEW.`name`, NEW.`tel`);END
--20T08::.954329Z Query CREATE TRIGGER `pt_osc_zlm_test_ddl_ins` AFTER INSERT ON `zlm`.`test_ddl` FOR EACH ROW REPLACE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) VALUES (NEW.`id`, NEW.`name`, NEW.`tel`)
--20T08::.959241Z Query EXPLAIN SELECT * FROM `zlm`.`test_ddl` WHERE =
--20T08::.961358Z Query EXPLAIN SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*explain pt-online-schema-change 4190 copy table*/
--20T08::.962004Z Query INSERT LOW_PRIORITY IGNORE INTO `zlm`.`_test_ddl_new` (`id`, `name`, `tel`) SELECT `id`, `name`, `tel` FROM `zlm`.`test_ddl` LOCK IN SHARE MODE /*pt-online-schema-change 4190 copy table*/
--20T08::.962769Z Query SHOW WARNINGS
--20T08::.963561Z Query SHOW GLOBAL STATUS LIKE 'Threads_running'
--20T08::.966643Z Query ANALYZE TABLE `zlm`.`_test_ddl_new` /* pt-online-schema-change */
--20T08::.968221Z Query RENAME TABLE `zlm`.`test_ddl` TO `zlm`.`_test_ddl_old`, `zlm`.`_test_ddl_new` TO `zlm`.`test_ddl`
--20T08::.983005Z Query DROP TABLE IF EXISTS `zlm`.`_test_ddl_old`
--20T08::.990393Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_del`
--20T08::.991005Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_upd`
--20T08::.991346Z Query DROP TRIGGER IF EXISTS `zlm`.`pt_osc_zlm_test_ddl_ins`
--20T08::.991966Z Query SHOW TABLES FROM `zlm` LIKE '\_test\_ddl\_new'
--20T08::.999016Z Quit
--20T08::.000302Z Quit
Supplement
###Create a test table "test_ddl_no_pk" without primary key.###
(root@localhost mysql3306.sock)[zlm]::>create table test_ddl_no_pk(
-> id int unsigned,
-> name varchar() not null default '',
-> tel tinyint unsigned not null default
-> ) engine=innodb charset=utf8mb4;
Query OK, rows affected (0.12 sec) (root@localhost mysql3306.sock)[zlm]::>insert into test_ddl_no_pk(id,name,tel) values(,'zlm',''),(,'aaron8219','');
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: ###Insert two records into above table.###
(root@localhost mysql3306.sock)[zlm]::>select * from test_ddl_no_pk;
+------+-----------+-----+
| id | name | tel |
+------+-----------+-----+
| | zlm | |
| | aaron8219 | |
+------+-----------+-----+
rows in set (0.00 sec) ###Execute pt-osc again.###
[root@zlm2 :: ~]
#pt-online-schema-change -hzlm2 -P3306 -uroot --ask-pass --alter "modify tel bigint default 0" --print --execute --no-check-alter D=zlm,t=test_ddl_no_pk
Enter MySQL password:
No slaves found. See --recursion-method if host zlm2 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, ,
copy_rows, , 0.25
create_triggers, ,
drop_triggers, ,
swap_tables, ,
update_foreign_keys, ,
Altering `zlm`.`test_ddl_no_pk`...
Creating new table...
CREATE TABLE `zlm`.`_test_ddl_no_pk_new` (
`id` int() unsigned DEFAULT NULL,
`name` varchar() NOT NULL DEFAULT '',
`tel` tinyint() unsigned NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
Created new table zlm._test_ddl_no_pk_new OK.
Altering new table...
ALTER TABLE `zlm`.`_test_ddl_no_pk_new` modify tel bigint default
Altered `zlm`.`_test_ddl_no_pk_new` OK.
--21T04:: Dropping new table...
DROP TABLE IF EXISTS `zlm`.`_test_ddl_no_pk_new`; -- There're no create triggers,copy rows and swap table operations any more but directly drop new table operation.
--21T04:: Dropped new table OK.
`zlm`.`test_ddl_no_pk` was not altered.
The new table `zlm`.`_test_ddl_no_pk_new` does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger. -- Indicate the reason why it stop working.
- pt-ocs depends on tirggers,there mustn't be triggers on original table.
- Primary key or unique key is indispensable when use it.Otherwise,it won't work normally.
- Although pt-ocs won't block online transactions but still recommend do online ddl operations in off-peak period.
Percona-Tookit工具包之pt-online-schema-change的更多相关文章
- schema change + ogg 变更手册
Check OGG until no data queuing in replication process:testRO:a)login test5 –l oggmgrb)oggc)#ggsci ...
- Online Schema Change for MySQL
It is great to be able to build small utilities on top of an excellent RDBMS. Thank you MySQL. This ...
- AppBoxFuture(四). 随需而变-Online Schema Change
需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...
- Online, Asynchronous Schema Change in F1
F1: A Distributed SQL Database That Scales http://disksing.com/understanding-f1-schema-change ma ...
- Online Schema Upgrade in MySQL Galera Cluster using TOI Method
http://severalnines.com/blog/online-schema-upgrade-mysql-galera-cluster-using-toi-method As a fo ...
- Schema 与数据类型优化
这是<高性能 MySQL(第三版)>第四章<Schema 与数据类型优化>的读书笔记. 1. 选择优化的数据类型 数据类型的选择原则: 越小越好:选择满足需求的最小类型.注意, ...
- Mysql: pt-table-checksum 和 pt-table-sync 检查主从一致性,实验过程
一.安装 percona 包 1.安装仓库的包 https://www.percona.com/doc/percona-repo-config/yum-repo.html sudo yum insta ...
- mysql大数据表改表结构方案
有一个表有上千W数据, 用什么方法给这个表加一个字段最快?1. alert2. 建一个表和第一个表一样,只是多了要加的字段,然后用多个INSERT INTO SELECT语句limit写入3. 就是导 ...
- 资源list:Github上关于大数据的开源项目、论文等合集
Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
Servlet3.0提供@WebFilter注解将一个实现了javax.servlet.Filter接口的类定义为过滤器,这样我们在web应用中使用过滤器时,也不再需要在web.xml文件中配置过滤器 ...
随机推荐
- Python pip windows安装
参考页面: [1] : https://pip.pypa.io/en/latest/installing.html [2] : http://stackoverflow.com/questions/4 ...
- asp: AJAX Database
<% @LANGUAGE="VBSCRIPT" CODEPAGE="65001" %> <!DOCTYPE html PUBLIC " ...
- Don't forget, a person's greatest emotional need is to feel appreciated.
Don't forget, a person's greatest emotional need is to feel appreciated.莫忘记,人类情感上最大的需要是感恩.
- 节点nodeName与nodeValue表
- Linux虚拟系统安装——Ubuntu18.04 & CentOS6.5
Linux虚拟系统安装--Ubuntu18.04 & CentOS6.5 摘要:Linux简介.虚拟系统安装.系统备份与文件介绍 1. Linux简介 (1)1968年,MIT.Bell实验室 ...
- Unity Android 真机调试
官方文档 https://docs.unity3d.com/Manual/AttachingMonoDevelopDebuggerToAnAndroidDevice.html 然而 按照官方文档 很多 ...
- JavaScript 面向对象编程(四)的常用方法、属性总结
面向对象的属性.方法.操作符总结,都是干货.想深入掌握面向对象的程序设计模式,必须掌握一下知识点.下列知识点注重于实现,原理还请借鉴<javascript高级程序设计> (基于javasc ...
- May 10th 2017 Week 19th Wednesday
Imagination is the source of creation. 想象是创作之源. Sometimes, creation and innovation are very simple, ...
- LAB2 软件测试 Selenium上机实验 2017
1.安装SeleniumIDE插件 打开Firefox——>菜单栏——>附加组件——>获取附加组件——>查看更多附加组件——>搜索框输入SeleniumIDE并查找——& ...
- 设计模式——原型模式(Prototype Pattern)
原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...