为了普及mysql的基本知识,特意弄了这个章节,主要是发现第一次接触的人都不知道怎么弄,或者看不懂,所以这里就详细说下吧
============================================================
数据导入
1.mysqlimport命令行导入数据
在使用mysqlimport命令导入数据时,数据来源文件名要和目标表一致,不想改文件名的话,可以复制一份创建临时文件,示例如下。
建立一个文本users.txt,内容如下:
创建一个表users
使用mysqlimport将users.txt中数据导入users表
PS F:\> mysqlimport -u root -p123456 zz --default-character-set=gbk --fields-terminated-by=',' f:\users.txtzz.users: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0-----------------------------验证----------------------------------mysql> select * from users\G*************************** 1. row *************************** id: 1003 name: 王五 email: wangwu@163.com*************************** 2. row *************************** id: 1001 name: 张三 email: zhangsan@163.com*************************** 3. row *************************** id: 1002 name: 李四 email: lisi@hotmail.com
分列,使用--fields-terninated-by参数来指定每列的分隔符,例如:
如果列值中出现了分隔符,例如 1004"#李#白"#"libai@hotmail.com"
PS F:\> mysqlimport -u root -p7758520 zz --fields-terminated-by='#' --fields-enclosed-by=\" f:\users.txt
如果遇到一条记录有多行,则可以使用--lines-terminated-by=name来指定行的结束符
PS F:\> mysqlimport -u root -p7758520 zz --fields-terminated-by='#' --fields-enclosed-by=\" --lines-terminated-by='xxx\n' f:\users.txt
2.使用Load Data语句导入数据
Load Data 语句的使用语法如下:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [CHARACTER SET charset_name] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [(col_name_or_user_var,...)] [SET col_name = expr,...]
刚开始看到这个语法吓了一跳,这么长,其实没这么复杂,一般只需记住LOAD DATA INFILE file_name INTO TABLE tb_name这个即可,示例:
首先创建一个表sql_users,利用上面的users表复制一下
mysql> create table sql_users as select * from users; Query OK, 1 row affected (0.06 sec) Records: 1 Duplicates: 0 Warnings: 0mysql> truncate table sql_users; Query OK, 0 rows affected (0.00 sec) mysql> select * from sql_users; Empty set (0.00 sec)
文本sql_users.txt
1004#李白#libai@hotmail.com 1005#杜牧#dumu@hotmail.com 1006#杜甫#dufu@hotmail.com 1007#苏轼#sushi@hotmail.com
利用LOAD DATA INFILEE语句导入数据
mysql> load data infile 'f:\sql_users.txt' into table sql_users fields terminated by '#'; Query OK, 4 rows affected (0.00 sec) Records: 4 Deleted: 0 Skipped: 0 Warnings: 0 mysql> select * from sql_users; +------+------+--------------------+ | id | name | email | +------+------+--------------------+ | 1004 | 李白 | libai@hotmail.com | 1005 | 杜牧 | dumu@hotmail.com | 1006 | 杜甫 | dufu@hotmail.com | 1007 | 苏轼 | sushi@hotmail.com | +------+------+--------------------+ 4 rows in set (0.00 sec)
如果在导入数据时,遇到字符串无法识别时,一般都是字符集有问题,使用charset选项即可解决
mysql> load data infile 'f:\sql_users.txt' into table sql_users fields terminated by '#'; ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xB0\xD7' for column 'name' at row 1--------------------------------字符集不一样-----------------------mysql> load data infile 'f:\sql_users.txt' into table sql_users character set gbk fields terminated by '#'; Query OK, 4 rows affected (0.03 sec) Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
LOAD DATA INFILE命令默认要导入数据存放在服务上,如果要导入客户端的数据,可以指定LOCAL,那么mysql将从客户端读取数据,这样的方式会比服务器上操作要慢一点,因为客户端的数据需要通过网络传输到服务器。
mysql> load data local infile 'f:\sql_users.txt' into table sql_users fields terminated by '#';
如果需要忽略与主键值重复的记录值或者替换重复值,可以使用IGNORE或REPLACE选项,但是LOAD DATA INFILE命令语法中有两处IGNORE关键字,前面一个是用来此功能的,后面一个用来指定需要忽略的前N条记录。
如果不想导入数据文件的前N行,使用IGNORE N LINES来处理
如果在数据文件中记录行头有某些字符,又不想被导入,可以使用LINES STARTING BY来解决,但是如果某行记录不包含这些字符的话,那么这行记录也会被忽略。
数据文件为Excel文件的处理,首先将Excel文件保存为CSV格式,这样字段间都是用逗号隔开的,再进行处理。
数据文件列值中有特殊符号,使用enclosed by来处理。例如,列值中有分隔符
数据导入时换行符的问题,在上面的示例中,有几个数据导入到表中后,查询时结果显示有点别扭,不知大家注意到了没。
在Windows系统中,文本格式的换行符有"\r+\n"组成,而在linux系统中,换行符是"\n"。因此出出现上述问题,解决方法就是指定换行符LINES TERMINATED BY。
mysql> LOAD DATA INFILE 'F:\stu.csv' INTO TABLE stu CHARACTER SET GBK FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
表的列数多余数据文件中的列数,解决方法就是指定要导入到表的字段,如下所示
如果是表的列数少于数据文件中的列数呢,解决办法可以指定用户变量来接收多余的列值,如下
最近因为公司业务需要一直在学习开源平台的内容,比如OpenStack和Docker等等,看着看着就对puppet和chef产生了一些兴趣,随之顺其自然的就发现其实在Windows平台也有自己原生的自动化运维解决方案,它就是PowerShell DSC(desired state configuration),按照字面理解就是"期望的配置状态",我本人对puppet和chef没有太多深入的研究,但是对比了一下两者与PowerShell DSC的实现机制发现的确是大同小异,在此也不讨论谁先谁后问题,更不会想到谁取代谁或谁更好用的问题,不过对于Win平台而言,即便puppet本身就是支持的,但既然有原生的PS DSC那它就一定是首选了。
那么简而言之PowerShell DSC究竟能干嘛,优势何在,其实它与puppet的用意是一样的,就是面对大规模部署环境时,我们需要满足一定的合规性,或者在某些时候需要批量的变更配置,很多情况下组策略或者脚本并不太适用,PS DSC不需要强制域环境,其次它作为PS语言的扩展,至需要在配置文件里声明你期望目标主机是一个什么样的状态,而无需关注如何实现这个状态,比如你想部署IIS,那么只需要声明你要求这台机器有IIS,至于通过什么样的命令去安装IIS你并不需要关心,这一切将有操作系统自行完成。
########################################################################################
PowerShell DSC有两种模式,推和拉,因为得益于是源自系统内置的PowerShell来实现,因此不必需要安装agent程序,推模式使用简单,但拉模式更适合有计划性的大规模批量配置变更,也方便修改,下图是两种模式的对比,可以看到拉模式需要一台"pull server"角色,这台服务器实际上会包含一个定义好的Web Serveice(Odata),客户端通过一个URI和相应的GUID来获取配置。
整个DSC的执行基本分为三个阶段:
-
创建阶段��通过ISE或者干脆使用记事本之类的工具来编写DSC配置并输出MOF格式文件(management object format)。
-
推送或拉取阶段��使用pull or push模式将相应的MOF格式文件传输到目标客户端。
-
执行阶段��客户端通过本地的LCM(local configuration manageer),LCM内置于操作系统内,如果使用push模式的话也不需要额外的配置,对于Windows Server 2012R2和8.1来说它是开箱即用的。
下图是我的测试环境,我在Azure准备了一台DC,如下图叫做pull server,IP:10.0.1.10
另外一台模拟客户端,叫做server01如下图:
部署好操作系统之后,默认提供12个开箱即用的资源,可以使用get-dscresource获得相应信息,DSC所管理和维护的每一类配置都称为"资源",通过系统自带的这些资源就可以实现大部分常见的维护工作,例如添加删除服务器角色、拷贝文件、创建用户和组、维护系统服务等内容,如下图:
下面就以最简单也最常用的windowsfeature为例,可以先看看他的属性都定义了哪些内容,例如这个资源的名称,dependson是可以定义需要添加的feature是基于那个依赖角色的,通过它可以实现不同资源的更改顺序,在或者ensure是定义这个功能是开启还是关闭,即"absent or present"
以下便是一个简单的示例,我指定一个configuration名为winserver的DSC配置文件,声明节点是server01,然后期望这台服务器要有两个windowsfeater分别是windowsbackup和telnetclient,编辑好之后直接执行脚本,如下图:
上面的脚本执行后并没有返回任何消息,这是我新建一个叫做script的文件夹并在这个文件夹下面执行我上文中定义好的configuration名(DSC配置文件名,在首行),即"winserver",执行后如果没有报错的话会在当前目录生成一个与node名一致的MOF文件,如下图:
最终就是要把这个mof文件搞到目标节点上去执行我期望的配置,可以查看该文件的内容如下图:
接下来我就使用简单的推模式来把这个mof搞到server01上去,推模式只需要执行"start-dscconfiguration"并指明mof文件路径,成功之后会在系统后台生成一个job,当然也可以指定job名称,如下图:
过一段时间后发现该job已经完成了,如下图:
登陆到server01上看看,噢~windowsbackup和telnetclient果然已经安装好了,如下图:
上面是一个非常简单的示例,可以看到在对大规模环境进行配置变更时,DSC是有绝对优势的,首先脚本更轻量,并且关键的是可通过test-dscconfiguration来检查变更是否符合要求,有很多其他方案虽然也能达到执行的效果,但是否成功或者说是否100%的按照管理员意愿完成了却不得而知。
#####################################################################################
此外在DSC配置文件中还可以定制属性,例如下图中我对nodename使用了变量,在执行时就可以通过我定义的"-vmname"来指定哪一个节点
在进行推送配置时,可以使用-wait和verbose来实时查看后台日志,如下图:
######################################################################################
以上就是对PowerShell推模式的简单介绍,如果对系统内置的12个资源不满意或感觉不够使的话,可以从官方获取更丰富的资源包,如下图:
没有评论:
发表评论