描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111744160
编辑推荐
(1)作者专业实力强劲:作者本身为资深Oracle OCM,主导过10余个大型数据平台建设案例及众多小型数据项目,并在武汉大学专门进修,最终总结15年来亲身经验,铸就本书。
(2)众多大咖力荐:盖国强、吕海波、李石君教授、周亮好评推荐,从实战到理论,从业务到学术,众多专家率先肯定了本书的实力与贡献。
(3)知识体系完善、深入浅出:本书旨在全面串联Oracle原理与技术体系,既补全了Unix系统内核、进程、排队论、集群等关联知识点,又深入浅出讲解了集中式数据库系统和Oracle RAC集群核心技术组件的基本概念、设计思想、实现方式,同时深度剖析其算法及AWR报告,并配合大量直观图示。通过本书,读者将更加系统地认识数据库,也容易进一步学习国产数据库的原理与操作。
(4)联系工作实际、实战性强:本书从DBA工作实际需求出发,不但提供体系化理论,更提供了高效、稳定的数据库系统实践及优化方法。无论读者从事数据库运维还是内核研发,都能从本书中获得借鉴思路与参考方法。
(2)众多大咖力荐:盖国强、吕海波、李石君教授、周亮好评推荐,从实战到理论,从业务到学术,众多专家率先肯定了本书的实力与贡献。
(3)知识体系完善、深入浅出:本书旨在全面串联Oracle原理与技术体系,既补全了Unix系统内核、进程、排队论、集群等关联知识点,又深入浅出讲解了集中式数据库系统和Oracle RAC集群核心技术组件的基本概念、设计思想、实现方式,同时深度剖析其算法及AWR报告,并配合大量直观图示。通过本书,读者将更加系统地认识数据库,也容易进一步学习国产数据库的原理与操作。
(4)联系工作实际、实战性强:本书从DBA工作实际需求出发,不但提供体系化理论,更提供了高效、稳定的数据库系统实践及优化方法。无论读者从事数据库运维还是内核研发,都能从本书中获得借鉴思路与参考方法。
内容简介
【为宏观掌握Oracle基础(第1~3章)】,介绍了进程管理、内存管理及存储等基础知识,并且讲解了常用Linux操作系统性能工具的使用及结果分析方法,旨在帮助读者了从宏观视角掌握Oracle数据库体系架构和进程组织方案。【微观理解Oracle原理(第4~8章)】,围绕Oracle内部运行原理展开讲解。首先,在Oracle数据结构的基础上讨论日志和回滚。其次,引入了排队论和排队系统中的概念,对比法讲解了Oracle的数据缓冲区高速缓存和共享池设计思想及运行原理。【串联Oracle运行流程(第9~11章)】,结合实践案例将从提交SQL至结果返回的整个过程串起来,首先总结归纳了Oracle算法和数据结构的重要知识点,打通了Oracle原理与数据结构之间的桥梁。其次,通过典型案例讲解AWR报告,让读者能够了解完整的Oracle诊断思路。再次,介绍了集群技术、Oracle RAC及其日志结构。然后,对Oracle多租户架构的演进过程及部分新特性进行了简要讨论及总结。
目 录
前 言
第一篇 宏观掌握Oracle基础
第1章 Oracle概貌及进程 2
1.1 Oracle概貌 2
1.1.1 串联Oracle知识体系的挑战 3
1.1.2 UNIX体系结构简介 4
1.1.3 Oracle进程状态转换 6
1.2 充分理解进程 8
1.2.1 何为进程 8
1.2.2 进程的状态 10
1.2.3 进程切换 11
1.2.4 进程间通信 11
1.3 Oracle的进程组织方案 12
1.3.1 2N方案:一个数据库服务器
进程对应一个用户进程 12
1.3.2 N+M方案:M个数据库服务器进程对应N个用户进程 14
1.4 Oracle的进程结构 15
1.4.1 Oracle常见进程及简介 15
1.4.2 Oracle进程的启动顺序 20
1.4.3 进程、连接、会话的区别 21
1.5 本章小结 22
第2章 Oracle内存与实例 24
2.1 虚拟存储管理 24
2.1.1 操作系统虚拟内存结构 24
2.1.2 共享内存段的概念 26
2.1.3 共享内存段与内核参数 26
2.1.4 查看共享内存段 27
2.1.5 共享内存段与进程 28
2.1.6 内存交换与HugePage 29
2.1.7 内存文件系统 29
2.2 Oracle实例 30
2.2.1 数据库实例的构成 30
2.2.2 ASM实例的构成 32
2.2.3 ASM启动与参数文件 33
2.2.4 数据库实例与ASM实例的
交互 34
2.3 Linux性能分析工具 35
2.3.1 查看进程队列及系统负载 36
2.3.2 查看I/O 38
2.4 Oracle常用视图及跟踪工具 40
2.4.1 常用动态性能视图 40
2.4.2 查看SQL执行计划 43
2.4.3 常用诊断和调试工具 46
2.5 本章小结 49
第3章 Oracle存储结构 50
3.1 存储体系结构 50
3.1.1 逻辑存储结构 52
3.1.2 段和表的区别 52
3.1.3 数据块结构 55
3.1.4 Rowid结构 56
3.1.5 索引结构及索引范围扫描 59
3.2 数据文件存储结构 60
3.2.1 数据文件物理存储结构 61
3.2.2 Oracle数据文件读取 62
3.3 日志文件存储结构 65
3.3.1 重做记录存储结构 65
3.3.2 检查点 66
3.3.3 控制文件 68
3.4 ASM存储结构 70
3.4.1 ASM磁盘组与磁盘 70
3.4.2 ASM文件 72
3.4.3 ASM空间分配 73
3.5 ASM存储设备配置 76
3.5.1 ASM磁盘发现 76
3.5.2 多路径配置 78
3.5.3 UDEV简介及配置 80
3.6 本章小结 81
第二篇 微观理解Oracle原理
第4章 重做 84
4.1 深入认识重做记录 84
4.1.1 SCN:系统改变号 85
4.1.2 SEQ与RBA 85
4.1.3 准备重做日志转储 86
4.1.4 转储文件的内容及构成 87
4.2 IMU与非IMU 89
4.2.1 非IMU的重做日志申请
过程 90
4.2.2 IMU的重做日志申请过程 91
4.3 LGWR的工作原理 93
4.3.1 写日志流程 93
4.3.2 3秒唤醒和commit写入的
差异 93
4.4 Redo等待事件 94
4.4.1 log buffer space 94
4.4.2 log file parallel write 94
4.4.3 log file sync 94
4.5 多LGWR进程 95
4.6 本章小结 96
第5章 回滚 98
5.1 回滚的概念及原理 98
5.1.1 Do-Undo-Redo协议 99
5.1.2 Undo部分的生成过程 99
5.1.3 数据块头、回滚段头、回滚块
之间的关系 104
5.1.4 事务槽及相关等待事件 108
5.2 读一致性及块清除 109
5.3 获取UNDO信息 110
5.4 本章小结 112
第6章 排队论和并发控制 113
6.1 排队论和事务处理 113
6.1.1 排队论的基本概念 113
6.1.2 事务的基本概念 116
6.1.3 事务流 118
6.2 响应时间曲线图和CPU、I/O
系统模型 119
6.2.1 响应时间曲线图 119
6.2.2 CPU系统模型 121
6.2.3 I/O系统模型 121
6.3 并发控制和封锁 122
6.3.1 并发控制的基本概念 122
6.3.2 封锁的概念和类型 123
6.4 Oracle多粒度锁机制 123
6.4.1 RDBMS的TM锁和
意向锁 124
6.4.2 Oracle的TM锁和意向锁 125
6.4.3 Oracle锁查询脚本 126
6.5 本章小结 126
第7章 数据缓冲区 128
7.1 数据缓冲区结构 128
7.1.1 Working Set 129
7.1.2 Buffer Header 129
7.1.3 Hash Bucket与
Hash Chain 130
7.2 并发控制及申请流程 131
7.2.1 CBC Latch和Pin 131
7.2.2 共享与独占 134
7.2.3 LRU队列 135
7.2.4 数据块申请流程 137
7.3 物理读与逻辑读 139
7.3.1 逻辑读过程及统计SQL 139
7.3.2 物理读过程及统计SQL 139
7.4 本章小结 140
第8章 共享池 142
8.1 共享池结构 142
8.1.1 子池 143
8.1.2 空闲列表与LRU 146
8.1.3 共享池内存申请流程 147
8.1.4 ORA-4031报错过程 149
8.2 SQL解析及并发控制 149
8.2.1 SQL解析及游标 150
8.2.2 library Cache Lock加锁
步骤 153
8.2.3 cursor_sharing 155
8.2.4 v$latch、v$latch_childred
统计 156
8.3 Mutex 157
8.3.1 Mutex简介 157
8.3.2 Mutex的类
第一篇 宏观掌握Oracle基础
第1章 Oracle概貌及进程 2
1.1 Oracle概貌 2
1.1.1 串联Oracle知识体系的挑战 3
1.1.2 UNIX体系结构简介 4
1.1.3 Oracle进程状态转换 6
1.2 充分理解进程 8
1.2.1 何为进程 8
1.2.2 进程的状态 10
1.2.3 进程切换 11
1.2.4 进程间通信 11
1.3 Oracle的进程组织方案 12
1.3.1 2N方案:一个数据库服务器
进程对应一个用户进程 12
1.3.2 N+M方案:M个数据库服务器进程对应N个用户进程 14
1.4 Oracle的进程结构 15
1.4.1 Oracle常见进程及简介 15
1.4.2 Oracle进程的启动顺序 20
1.4.3 进程、连接、会话的区别 21
1.5 本章小结 22
第2章 Oracle内存与实例 24
2.1 虚拟存储管理 24
2.1.1 操作系统虚拟内存结构 24
2.1.2 共享内存段的概念 26
2.1.3 共享内存段与内核参数 26
2.1.4 查看共享内存段 27
2.1.5 共享内存段与进程 28
2.1.6 内存交换与HugePage 29
2.1.7 内存文件系统 29
2.2 Oracle实例 30
2.2.1 数据库实例的构成 30
2.2.2 ASM实例的构成 32
2.2.3 ASM启动与参数文件 33
2.2.4 数据库实例与ASM实例的
交互 34
2.3 Linux性能分析工具 35
2.3.1 查看进程队列及系统负载 36
2.3.2 查看I/O 38
2.4 Oracle常用视图及跟踪工具 40
2.4.1 常用动态性能视图 40
2.4.2 查看SQL执行计划 43
2.4.3 常用诊断和调试工具 46
2.5 本章小结 49
第3章 Oracle存储结构 50
3.1 存储体系结构 50
3.1.1 逻辑存储结构 52
3.1.2 段和表的区别 52
3.1.3 数据块结构 55
3.1.4 Rowid结构 56
3.1.5 索引结构及索引范围扫描 59
3.2 数据文件存储结构 60
3.2.1 数据文件物理存储结构 61
3.2.2 Oracle数据文件读取 62
3.3 日志文件存储结构 65
3.3.1 重做记录存储结构 65
3.3.2 检查点 66
3.3.3 控制文件 68
3.4 ASM存储结构 70
3.4.1 ASM磁盘组与磁盘 70
3.4.2 ASM文件 72
3.4.3 ASM空间分配 73
3.5 ASM存储设备配置 76
3.5.1 ASM磁盘发现 76
3.5.2 多路径配置 78
3.5.3 UDEV简介及配置 80
3.6 本章小结 81
第二篇 微观理解Oracle原理
第4章 重做 84
4.1 深入认识重做记录 84
4.1.1 SCN:系统改变号 85
4.1.2 SEQ与RBA 85
4.1.3 准备重做日志转储 86
4.1.4 转储文件的内容及构成 87
4.2 IMU与非IMU 89
4.2.1 非IMU的重做日志申请
过程 90
4.2.2 IMU的重做日志申请过程 91
4.3 LGWR的工作原理 93
4.3.1 写日志流程 93
4.3.2 3秒唤醒和commit写入的
差异 93
4.4 Redo等待事件 94
4.4.1 log buffer space 94
4.4.2 log file parallel write 94
4.4.3 log file sync 94
4.5 多LGWR进程 95
4.6 本章小结 96
第5章 回滚 98
5.1 回滚的概念及原理 98
5.1.1 Do-Undo-Redo协议 99
5.1.2 Undo部分的生成过程 99
5.1.3 数据块头、回滚段头、回滚块
之间的关系 104
5.1.4 事务槽及相关等待事件 108
5.2 读一致性及块清除 109
5.3 获取UNDO信息 110
5.4 本章小结 112
第6章 排队论和并发控制 113
6.1 排队论和事务处理 113
6.1.1 排队论的基本概念 113
6.1.2 事务的基本概念 116
6.1.3 事务流 118
6.2 响应时间曲线图和CPU、I/O
系统模型 119
6.2.1 响应时间曲线图 119
6.2.2 CPU系统模型 121
6.2.3 I/O系统模型 121
6.3 并发控制和封锁 122
6.3.1 并发控制的基本概念 122
6.3.2 封锁的概念和类型 123
6.4 Oracle多粒度锁机制 123
6.4.1 RDBMS的TM锁和
意向锁 124
6.4.2 Oracle的TM锁和意向锁 125
6.4.3 Oracle锁查询脚本 126
6.5 本章小结 126
第7章 数据缓冲区 128
7.1 数据缓冲区结构 128
7.1.1 Working Set 129
7.1.2 Buffer Header 129
7.1.3 Hash Bucket与
Hash Chain 130
7.2 并发控制及申请流程 131
7.2.1 CBC Latch和Pin 131
7.2.2 共享与独占 134
7.2.3 LRU队列 135
7.2.4 数据块申请流程 137
7.3 物理读与逻辑读 139
7.3.1 逻辑读过程及统计SQL 139
7.3.2 物理读过程及统计SQL 139
7.4 本章小结 140
第8章 共享池 142
8.1 共享池结构 142
8.1.1 子池 143
8.1.2 空闲列表与LRU 146
8.1.3 共享池内存申请流程 147
8.1.4 ORA-4031报错过程 149
8.2 SQL解析及并发控制 149
8.2.1 SQL解析及游标 150
8.2.2 library Cache Lock加锁
步骤 153
8.2.3 cursor_sharing 155
8.2.4 v$latch、v$latch_childred
统计 156
8.3 Mutex 157
8.3.1 Mutex简介 157
8.3.2 Mutex的类
前 言
为什么要写这本书
数据库管理知识,除了数据库本身的基本概念、设计、实现等知识以外,还涉及操作系统、存储、网络等内容。尤其是在对生产业务数据库进行复杂的故障诊断及性能优化时,我们总会发现仅掌握数据库本身的知识并不够。但是作为初中级DBA(数据库管理员),我们会在某个阶段陷入学习瓶颈,找不到突破的方法。
自从2008年接触Oracle数据库以来,我看了大量关于Oracle的国内外书籍,但对很多内容体会不深,看了没多久就忘了。我曾在2015年参加OCM认证考试,发现数据库性能优化和故障诊断等方面的能力无法仅凭学习考试涉及的理论知识获取。后来我有幸参加了盖国强、吕海波等专家开展的DBA短期培训,收获很大。与这些专家沟通之后,我对Oracle数据库的设计思想、架构实现、性能优化等方面有了更深入的理解,并且更进一步探究UNIX内核、进程及进程间通信、数据结构(链表、树、哈希表)、Socket通信等内容。
最终,我有了梳理、总结Oracle数据库内核知识,并将之与其他相关的关键技术点串联起来、写作成书的想法。
我把写书的想法及初步整理的素材发给ACE总监、Oracle顾问专家周亮,获得了他的鼓励和帮助。于是,我借着自己2018年在武汉大学访学的机会,充分利用了该校图书馆里的图书资源,并结合李石君教授通俗易懂的数据库原理课程,开始了系统性的整理和写作之旅。
有很多读者与我曾经的情况类似,受制于技术瓶颈而徘徊不前,迟迟无法实现进一步提升。而本书是我对自己多年学习和实践Oracle数据库的经验总结,能帮助读者节省学习时间,少走弯路,突破数据库的学习瓶颈。
读者对象
本书适合如下读者阅读:
初中级DBA
数据库技术爱好者
想突破Oracle学习瓶颈并拓宽思路的人
本书特色
掌握Oracle技术及原理,尤其是学习Oracle在并发控制、事务处理、诊断优化手段等方面的解决思路和实现算法,对DBA深入理解关系型数据库乃至大数据技术有很大帮助。
本书将Oracle相关知识点串联讲解,旨在令读者对该数据库理论融会贯通,以应用于实际工作,提高技术水平。而要达到这样的境界则须理解甚至掌握操作系统、计算机网络、排队论等相关的基础及辅助知识。所以,本书适当引入了超出数据库本身范畴的知识点,尽量强调概念根源和设计思想,同时力求通过梳理将Oracle相关知识由庞杂变得简洁有条理,并将其以通俗易懂的语言呈现出来。
如何阅读本书
本书共11章,分为三篇,各篇主要内容如下。
第一篇(第1~3章) 宏观掌握Oracle基础
本篇介绍了进程管理、内存管理及存储结构等基础知识,并且讲解了Linux操作系统性能工具的使用及结果分析方法,旨在帮助读者从宏观视角掌握Oracle数据库体系架构和进程组织方案。
第二篇(第4~8章) 微观理解Oracle原理
本篇围绕Oracle内部运行原理展开讲解。首先,在Oracle数据结构的基础上讨论重做和回滚日志。其次,引入了排队论和并发控制的概念,对比讲解了Oracle的数据缓冲区和共享池的设计思想及运行原理。
第三篇(第9~11章) 串联Oracle运行流程
本篇结合实践案例将从SQL提交至最终结果返回的整个运行过程串联起来。首先,总结归纳了Oracle算法和数据结构的重要知识点,打通了Oracle原理与数据结构之间的桥梁。其次,通过典型案例讲解AWR(Automatic Workload Repository,自动负载信息库)报告,让读者能够了解完整的Oracle诊断思路。再次,介绍了集群技术、Oracle RAC(真正应用集群)及其日志结构。最后,对Oracle多租户架构的演变及部分新特性进行了简要讨论及总结。
如果你是一名经验丰富的DBA,已经理解了Oracle的相关基础知识和使用技巧,那么可以直接阅读第三篇。如果你是一名初学者或中级DBA,那么建议从第一篇开始学习,以便对操作系统及进程等基础概念建立相对深入且正确的认识。
勘误和支持
如果书中出现了错误或者不准确的地方,恳请读者批评指正。为了方便与各位读者交流,我创建了微信公众号(微信号:kuqlan)。欢迎你将书中的错误发给我,或者在遇到Oracle相关问题时留言,我将努力解答。此外,本书中的全部代码都将发布在该公众号上。如果你有更多的宝贵意见,也欢迎发送邮件至[email protected],很期待听到你的反馈。
致谢
感谢ACE总监周亮。在我写作本书的过程中,他不但鼓励我,而且对我的技术疑惑有问必答。没有他的鼓励和支持,就不会有这本书。我认为,在数据库“江湖”中,周亮是故障诊断及处理领域的“小李飞刀”。
感谢吕海波专家。我因OCM(Oracle Certified Master,Oracle认证大师)培训认识了他,他的课程及著作帮助我深入理解Oracle内核,与他的每次交流都能解决我的许多疑惑。
感谢武汉大学的李石君教授及武大图书馆。李教授的课程进一步巩固了我的数据库管理理论基础;而武大图书馆为我提供了丰富的学习资料,为编写本书,我几乎翻遍了这个图书馆里所有与Oracle相关的书籍。
感谢我的家人,他们的理解及默默支持时时刻刻为我灌输着信心和力量!
数据库管理知识,除了数据库本身的基本概念、设计、实现等知识以外,还涉及操作系统、存储、网络等内容。尤其是在对生产业务数据库进行复杂的故障诊断及性能优化时,我们总会发现仅掌握数据库本身的知识并不够。但是作为初中级DBA(数据库管理员),我们会在某个阶段陷入学习瓶颈,找不到突破的方法。
自从2008年接触Oracle数据库以来,我看了大量关于Oracle的国内外书籍,但对很多内容体会不深,看了没多久就忘了。我曾在2015年参加OCM认证考试,发现数据库性能优化和故障诊断等方面的能力无法仅凭学习考试涉及的理论知识获取。后来我有幸参加了盖国强、吕海波等专家开展的DBA短期培训,收获很大。与这些专家沟通之后,我对Oracle数据库的设计思想、架构实现、性能优化等方面有了更深入的理解,并且更进一步探究UNIX内核、进程及进程间通信、数据结构(链表、树、哈希表)、Socket通信等内容。
最终,我有了梳理、总结Oracle数据库内核知识,并将之与其他相关的关键技术点串联起来、写作成书的想法。
我把写书的想法及初步整理的素材发给ACE总监、Oracle顾问专家周亮,获得了他的鼓励和帮助。于是,我借着自己2018年在武汉大学访学的机会,充分利用了该校图书馆里的图书资源,并结合李石君教授通俗易懂的数据库原理课程,开始了系统性的整理和写作之旅。
有很多读者与我曾经的情况类似,受制于技术瓶颈而徘徊不前,迟迟无法实现进一步提升。而本书是我对自己多年学习和实践Oracle数据库的经验总结,能帮助读者节省学习时间,少走弯路,突破数据库的学习瓶颈。
读者对象
本书适合如下读者阅读:
初中级DBA
数据库技术爱好者
想突破Oracle学习瓶颈并拓宽思路的人
本书特色
掌握Oracle技术及原理,尤其是学习Oracle在并发控制、事务处理、诊断优化手段等方面的解决思路和实现算法,对DBA深入理解关系型数据库乃至大数据技术有很大帮助。
本书将Oracle相关知识点串联讲解,旨在令读者对该数据库理论融会贯通,以应用于实际工作,提高技术水平。而要达到这样的境界则须理解甚至掌握操作系统、计算机网络、排队论等相关的基础及辅助知识。所以,本书适当引入了超出数据库本身范畴的知识点,尽量强调概念根源和设计思想,同时力求通过梳理将Oracle相关知识由庞杂变得简洁有条理,并将其以通俗易懂的语言呈现出来。
如何阅读本书
本书共11章,分为三篇,各篇主要内容如下。
第一篇(第1~3章) 宏观掌握Oracle基础
本篇介绍了进程管理、内存管理及存储结构等基础知识,并且讲解了Linux操作系统性能工具的使用及结果分析方法,旨在帮助读者从宏观视角掌握Oracle数据库体系架构和进程组织方案。
第二篇(第4~8章) 微观理解Oracle原理
本篇围绕Oracle内部运行原理展开讲解。首先,在Oracle数据结构的基础上讨论重做和回滚日志。其次,引入了排队论和并发控制的概念,对比讲解了Oracle的数据缓冲区和共享池的设计思想及运行原理。
第三篇(第9~11章) 串联Oracle运行流程
本篇结合实践案例将从SQL提交至最终结果返回的整个运行过程串联起来。首先,总结归纳了Oracle算法和数据结构的重要知识点,打通了Oracle原理与数据结构之间的桥梁。其次,通过典型案例讲解AWR(Automatic Workload Repository,自动负载信息库)报告,让读者能够了解完整的Oracle诊断思路。再次,介绍了集群技术、Oracle RAC(真正应用集群)及其日志结构。最后,对Oracle多租户架构的演变及部分新特性进行了简要讨论及总结。
如果你是一名经验丰富的DBA,已经理解了Oracle的相关基础知识和使用技巧,那么可以直接阅读第三篇。如果你是一名初学者或中级DBA,那么建议从第一篇开始学习,以便对操作系统及进程等基础概念建立相对深入且正确的认识。
勘误和支持
如果书中出现了错误或者不准确的地方,恳请读者批评指正。为了方便与各位读者交流,我创建了微信公众号(微信号:kuqlan)。欢迎你将书中的错误发给我,或者在遇到Oracle相关问题时留言,我将努力解答。此外,本书中的全部代码都将发布在该公众号上。如果你有更多的宝贵意见,也欢迎发送邮件至[email protected],很期待听到你的反馈。
致谢
感谢ACE总监周亮。在我写作本书的过程中,他不但鼓励我,而且对我的技术疑惑有问必答。没有他的鼓励和支持,就不会有这本书。我认为,在数据库“江湖”中,周亮是故障诊断及处理领域的“小李飞刀”。
感谢吕海波专家。我因OCM(Oracle Certified Master,Oracle认证大师)培训认识了他,他的课程及著作帮助我深入理解Oracle内核,与他的每次交流都能解决我的许多疑惑。
感谢武汉大学的李石君教授及武大图书馆。李教授的课程进一步巩固了我的数据库管理理论基础;而武大图书馆为我提供了丰富的学习资料,为编写本书,我几乎翻遍了这个图书馆里所有与Oracle相关的书籍。
感谢我的家人,他们的理解及默默支持时时刻刻为我灌输着信心和力量!
评论
还没有评论。