MySQL备份与恢复
mysqldump和xtrabackup是MySQL数据库中常用的两种备份工具,它们各自有不同的特点和适用场景:
- 备份方式:
- mysqldump:逻辑备份工具,通过生成SQL语句来备份数据库的数据和结构。
- xtrabackup:物理备份工具,直接复制数据文件,特别适合InnoDB和XtraDB数据库的热备份。
- 数据保存方式:
- mysqldump:保存为SQL脚本文件,便于查看和编辑,适合数据迁移。
- xtrabackup:保存为二进制文件,恢复速度快,但占用空间较大。
- 是否支持热备份:
- mysqldump:支持热备份,但备份过程中可能会锁定数据库。
- xtrabackup:支持热备份,备份过程不会打断正在执行的事务,对正常业务影响小。
- 备份过程:
- mysqldump:备份过程中可能会锁表,影响数据库的正常业务。
- xtrabackup:备份过程不锁表,对数据库业务影响较小。
- 备份和恢复性能:
- mysqldump:备份和恢复耗时较长,特别是对于大型数据库。
- xtrabackup:备份和恢复速度快,适合大规模数据量的快速备份和恢复。
- 占用空间:
- mysqldump:生成的备份文件相对较小,占用空间小。
- xtrabackup:因为是物理备份,可能会占用更多的磁盘空间。
- 适用场景:
- mysqldump:适合业务数据库相对较小,或者需要导出数据库进行数据迁移的场景。
- xtrabackup:适合数据量较大,需要快速备份和恢复,且对业务影响尽可能小的场景。
mysqldump和xtrabackup各有优势,选择时应根据具体的业务需求和数据库环境来决定使用哪种备份工具,总的来说:为了节省空间或内存不多且数据量不大,也不怕影响业务则可使用mysqldump,空间足够,数据量大,需要不锁表建议使用xtrabackup
1.mysqldump备份工具
mkdir /opt/backup #创建目录
1.1完全备份
mysqldump -u root -p密码 --databases 数据库名 > /opt/backup/备份文件名.sql #单个数据库备份
mysqldump -u root -p密码 --databases 数据库名1 数据库名2 > /opt/backup/备份文件名.sql #多个数据库备份
mysqldump -u root -p密码 --all-databases > /opt/backup/备份文件名.sql #备份MySQL所有的库
mysqldump -u root -p密码 -d 数据库名 表名 /opt/backup/备份文件名.sql #备份数据库的表,-d表示仅备份表结构,不加-d则数据也保存
举个例子
mysqldump -u root -plmx --databases a > /opt/backup/a.sql #单个备份
mysqldump -u root -plmx --databases a b > /opt/backup/aheb.sql #多个备份
mysqldump -u root -plmx --all-databases > /opt/backup/all.sql #备份所有库
mysqldump -u root -plmx -d a t /opt/backup/a-t.sql
区别如下
cat a.sql | grep '^CREATE DATABASE'
cat aheb.sql | grep '^CREATE DATABASE'
cat all.sql | grep '^CREATE DATABAS'
cat a-t.sql|grep -v "^--" | grep -v "^/" | grep -v "^$"
1.2完全恢复
2.1通过source命令恢复数据库
mysql -u root -plmx #登录数据库
source /opt/backup/备份文件名称 #执行脚本
show databases; #查看是否恢复
举个例子
mysqldump -u root -plmx --databases a > /opt/backup/a.sql #先备份a这个数据库
mysql> drop database a; #误删除了a这个数据库
mysql -u root -plmx #登录数据库
source /opt/backup/a.sql #执行脚本
2.2 通过命令行恢复数据库
mysql -u root -plmx < /opt/backup/备份文件名称
mysql -u root -pabc123 -e 'show databases;' #查看数据库
举个例子
mysqldump -u root -plmx --databases a > /opt/backup/a.sql #先备份a这个数据库
mysql -u root -plmx -e 'drop database a' #误删除a这个数据库
mysql -u root -plmx < /opt/backup/a.sql #执行脚本
2.3 恢复表数据
mysqldump -u root -plmx -d a t /opt/backup/a-t.sql #备份表数据
mysql -uroot -plmx -e 'drop table a.t;' #误删除表
mysql -u root -plmx a < /opt/backup/a-t.sql #恢复表数据
1.3增量备份与恢复
是自上一次备份后增加/变化的文件或者内容
特点:恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复
需要通过二进制日志间接实现增量备份
MySQL二进制日志对备份的意义
- 二进制日志保存了所有更新或者可能更新数据库的操作
- 二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
- 只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份
3.1 开启二进制日志功能
vim /etc/my.cnf #编辑配置文件,在mysqld中添加这三行
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
3.2 查看二进制日志目录
systemctl start mysqld #启动mysql,如果启动中,就systemctl restart mysqld
ls -l /var/lib/mysql/mysql-bin.* #/var/lib/mysql
#这是我的数据存放位置,个人设置的在那,就输入那个路径
3.3 通过刷新二进制日志文件间接实现增量备份
mysqladmin -uroot -plmx flush-logs #刷新之后会新增一个日志文件
3.4 查看二进制日志内容
cp /var/lib/mysql/mysql-bin.000001 /opt #移动到opt目录下
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001
#查看二进制日志文件内容
3.5 创建文件夹
mkdir mysql-backup
mkdir /mysql-backup/full #full文件夹做完全备份
mkdir /mysql-backup/bin #bin文件夹做增量备份
一般恢复
1.对ceshi下的a表完全备份
mysqldump -u root -plmx ceshi a > /root/mysql-backup/full/ceshi-a.sql
mysqladmin -uroot -plmx flush-logs #生成新的二进制日志文件
ls -l /var/lib/mysql/mysql-bin.* #查看
2.录入新的数据,进行增量备份
mysql> insert into a values(7,7,26),(8,8,27),(9,9,28); #在mysql a表里插入数据
mysqladmin -uroot -plmx flush-logs #生成新的二进制日志文件
ls -l /var/lib/mysql/mysql-bin.* #查看
mv /var/lib/mysql/mysql-bin.000003 /root/mysql-backup/bin/zengliang
#进行增量备份,备份的不是最新的那一个,备份的是倒数第二个
3.模拟删除库,先进行表的完全恢复
show databases;
drop database ceshi;
create database ceshi;#因为只对表做了备份,没有对库做备份,所以要先建一个数据库
show databases;
exit
#先完全恢复数据表里的初始数据
mysql -u root -plmx ceshi < full/ceshi-a.sql
#进入数据库查看
use ceshiselect * from a;
4.进行增量恢复
mysqlbinlog --no-defaults /root/mysql-backup/bin/zengliang | mysql -u root -plmx #通过管道符导入的方式
断点恢复
查看二进制文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v /root/mysql-backup/bin/zengliang #查看二进制备份文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v zengliang > mysql-bin-2024-11-27 #进入bin目录重定向
删除id=7/8/9
mysql> delete from a where id>=7;
恢复数据
mysqlbinlog --no-defaults --start-position='319' /root/mysql-backup/bin/zengliang | mysql -u root -plmx
#基于位置恢复,也就是at项
mysqlbinlog --no-defaults --start-datetime='2024-11-27 0:33:16' \
--stop-datetime='2024-11-27 0:37:01' /root/mysql-backup/bin/ \
zengliang | mysql -u root -plmx
#基于时间恢复,也就是从第一条的时间到DELIMITER上面一条的时间
#如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
#如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start
2.Xtrabackup备份
2.1 下载安装包
从下方链接中,可以获得 Percona 所有产品的安装包:
https://www.percona.com/downloads
这里可以选择 Xtrabackup 对应的系列版本。版本号规则,例如 Percona XtraBackup 8.0.26-18 的版本号定义了以下信息:
- 基础版本 - 最左边的数字表示用作基础的 MySQL 8.0 版本。
- 次要版本 - 表示软件版本的内部编号。
8.0.26 | -18 |
---|---|
Base version | Minor build version |
需要注意的是 Percona XtraBackup 编号在 8.0.14 版本之后发生了变化,以使 Percona XtraBackup 版本与 MySQL 保持一致。
所以在备份前,请确保 Percona XtraBackup 的版本等于或高于正在备份的数据库版本
2.2 二进制部署
通过WindTerm或别的工具上传安装包
[root@lmx ~]# tar -zxvf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz #解压缩
[root@lmx ~]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17 /usr/local/xtrabckup-8.0.26 #移动目录
[root@lmx ~]# ln -sf /usr/local/xtrabckup-8.0.26/bin/* /usr/bin/ #配置软链接
完成以上三步就安装完成了,输入xtrabckup --version
查看版本
2.3 xtrabckup 程序文件介绍
重点是bin目录下的这五个文件,接下来逐一解释
-
xbcloud 与流式备份相结合,可将备份存储到 OSS 对象存储上。
-
xbcloud_osenv:对
xbcloud
的二次封装, -
xbcrypt:用来加密解密。
-
xbstream:是一个用于压缩和解压缩
xtrabackup
备份的工具 -
xtrabackup:备份的主程序,备份和恢复的工具。
xtrabackup 8.0 中,innobackupex 被移除了,只使用 xtrabackup 二进制程序进行备份恢复操作,接下来都是用xtrabckup
来演示
2.4 设置权限
由于Xtrabackup 备份工具,备份时用户需要有以下权限:
- Reload
- 这个权限允许执行
FLUSH TABLES WITH READ LOCK
(FTWRL)和FLUSH NO_WRITE_TO_BINLOG TABLES
等命令。FTWRL会锁定所有表以供读取,这在备份过程中是必须项,以确保数据的一致性
- 这个权限允许执行
- Replication client
- 拥有此权限可以执行
SHOW MASTER STATUS
和SHOW SLAVE STATUS
命令,这些命令用于查看主库和从库的复制状态,包括二进制日志的位置信息。这对于基于二进制日志的备份和恢复过程至关重要,必须项。
- 拥有此权限可以执行
- BACKUP_ADMIN
BACKUP_ADMIN
权限允许执行LOCK INSTANCE FOR BACKUP
命令,该命令用于在备份过程中锁定整个MySQL实例。这是MySQL版本特有的权限,用于确保备份期间数据库的一致性,必须项。
- Process
- 拥有
Process
权限可以执行SHOW ENGINE INNODB STATUS
和SHOW PROCESSLIST
命令,这些命令提供了关于InnoDB存储引擎状态和当前数据库连接的信息,必须项。
- 拥有
- SYSTEM_VARIABLES_ADMIN
- 此权限允许设置全局系统变量,如
mysqlbackup.backupid
。在增量备份时,可能需要设置这样的变量来跟踪备份的ID。然而,这个权限不是Xtrabackup备份的必需权限,除非特定的备份策略需要它。
- 此权限允许设置全局系统变量,如
- SUPER
SUPER
权限允许执行一些高级操作,如杀掉长时间运行的查询(在--kill-long-queries-timeout
选项下)和重启复制(在从库备份时使用--safe-slave-backup
选项)。这个权限在需要处理这些特定情况时很有用。
- SHOW VIEW
- 拥有
SHOW VIEW
权限可以查看数据库中的视图。确定是否有非INnDB 引擎表。
- 拥有
- mysql.component 表的查询权限
- 如果使用Page Tracking进行增量备份,Xtrabackup可能需要查询
mysql.component
表来获取有关服务器组件的信息。这个权限对于正确执行Page Tracking增量备份是必要的。
- 如果使用Page Tracking进行增量备份,Xtrabackup可能需要查询
- performance_schema.xtrabackup_history 的 SELECT、INSERT、CREATE、ALTER 权限
- 如果指定了
--history
选项,Xtrabackup将需要访问performance_schema.xtrabackup_history
表来存储和检索备份历史信息。这些权限允许Xtrabackup创建、修改和查询这个表。
- 如果指定了
以下是mysql 8.0 以上版本的完整授权示例:
create user 'a'@'localhost' identified by 'a123456'; #创建用户并设置密码
grant Reload, Replication client, BACKUP_ADMIN, Process, LOCK TABLES on *.* to 'a'@'localhost';
#授予以上说的4个必备权限,加上一个LOCK TABLES 它允许用户锁定数据库中的表,以防止其他用户对这些表进行写操作
grant select on performance_schema.log_status to 'a'@'localhost';
#log_status表包含有关服务器日志状态的信息,如错误日志、查询日志、慢查询日志等的状态。
grant select on performance_schema.keyring_component_status to 'a'@'localhost';
#keyring_component_status表提供了关于服务器密钥环组件状态的信息,密钥环组件用于存储和管理加密密钥。
grant select on performance_schema.replication_group_members to 'a'@'localhost';
#replication_group_members表包含了关于MySQL Group Replication组成员的信息,这组成员是MySQL的一个高可用性和数据复制功能。
# performance_schema是MySQL的一个内置数据库,它提供了服务器运行时性能数据的访问这些性能数据包括各种内部指标,如锁等待、线程状态、事件等待等,以及关于服务器组件(如密钥环组件)和复制组成员的信息。
2.5 本地全量备份
mkdir -p /mysql-backup/full #创建备份存放目录
xtrabackup --backup --slave-info -u root -plmx --parallel=5 -S /var/lib/mysql/mysql.sock --target-dir=/root/mysql-backup/full/bakup_`date +"%F_%H_%M_%S"` 2>/tmp/xtrabackup.log
参数解释:
- –backup:发起全量备份。
- -S 指定sock文件
- -u, -H, -P, -p:连接 mysql 实例,用户名、主机 IP、端口、密码。
- –slave-info:记录 slave 复制位点信息,一般备份从库需要指定该参数。
- –target-dir:备份文件的存放路径。
- –parallel:并发拷贝的线程数。
- 2>/tmp/xtrabackup.log:将备份过程中的日志重定向到 /tmp/xtrabackup.log 文件中。
最后备份完成会出现 completed OK!
备份完成之后除了有数据库还有其他文件
- backup-my.cnf:记录了一些 Innodb 引擎的参数,会在 Prepare 阶段用到。
- xtrabackup_logfile:保存拷贝的 redo log。
- xtrabackup_binlog_info:使用该备份恢复后,需要从该 binlog 位点进行增量恢复。
- xtrabackup_slave_info:如果是对从库进行备份,指定 --slave-info 该文件会记录主节点的位点信息,取自
SHOW SLAVE STATUS
中的Relay_Master_Log_File
和Exec_Master_Log_Pos
。如果是给主库备份,该文件为空。 - xtrabackup_checkpoints:该文件记录了备份类型和 LSN 信息。
- xtrabackup_info:该文件中,记录备份的详细信息。
- xtrabackup_tablespaces:记录备份集中表空间的信息。
2.6 本地压缩备份
xtrabackup --backup --slave-info -u root -plmx --parallel=5 --compress \
-S /var/lib/mysql/mysql.sock --target-dir=/root/mysql-backup/full/bakup_`date +"%F_%H_%M_%S"`
除了添加一个--compress
参数以外都一致,成功之后也会出现completed OK!
Xtrabackup 8.0 支持两种压缩算法 zstd(默认) 和 lz4 算法,在准备恢复阶段之前,必须要先进行解压
xtrabackup --decompress --target-dir=/root/mysql-backup/full/bakup_2024-11-30_18_29_46
使用--decompress
解压,成功后也会出现completed OK!
如果出现以下错误,提示没有安装qpress安装包,直接wegt下载就行了
wget http://www.quicklz.com/qpress-11-linux-x64.tar
如果只是本地自己试验玩一玩请参考博主 薄群洋Drew的文章本地安装
https://blog.csdn.net/gitblog_09799/article/details/143074217?fromshare=blogdetail&sharetype=blogdetail&sharerId=143074217&sharerefer=PC&sharesource=2301_80479959&sharefrom=from_link
2.7 全量流式备份
流式备份指将备份数据通过流的方式输出到 STDOUT,而不是备份文件中。结合管道,可将多个功能组合在一起,如压缩、加密、流控等,在xtrabackup 8.0 中,仅支持 xbstream 流格式。
gzip 本地压缩备份
xtrabackup --backup -u root -plmx -S /var/lib/mysql/mysql.sock \
--stream=xbstream --target-dir=/root/mysql-backup/full/backup_`date +"%F_%H_%M_%S"` \
| gzip - > /root/mysql-backup/full/backup1.gz
除了添加`--stream=xbstream`参数,其他参数都一致,成功后也会出现completed OK!
恢复时需要先使用 gunzip 解压,再使用 xbstream 解压,才能进行 Prepare 阶段。
# gzip 解压
gunzip backup1.gz
# xbstream 解压,将当前目录下的 ./backup1解压到 /root/mysql-backup/full/ 里面
xbstream -x -C /root/mysql-backup/full/ < ./backup1
2.8 全量备份恢复数据
模拟误删数据库
show databases;#查看数据库
+--------------------+
| Database |
+--------------------+
| agan |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
drop database agan;#删除数据库
Query OK, 1 row affected (0.04 sec)
show databases;#再次查看
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
systemctl stop mysqld #停止数据库
mkdir -p /tmp/shujuku #创建目录
mv /var/lib/mysql/* /tmp/shujuku/
#恢复实例的数据目录必须为空,所以在恢复前,我们需要清空 MySQL 数据目录,或者将其 mv 备份
ll /var/lib/mysql #确定清空,清空会显示‘总用量 0’
检查数据一致性
xtrabackup --prepare --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 -u root -plmx
#成功后会出现completed OK!
恢复数据
xtrabackup --copy-back --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 -u root -plmx
#成功后会出现completed OK!命令中 --copy-back 表示将备份数据文件拷贝到 MySQL 数据目录下。如果在存储空间不足的情况下,可以使用 --move-back 表示移动备份文件。
修改文件主属性
ll /var/lib/mysql #由于恢复之后是root用户和组,需要修改权限
chown -R mysql:mysql /var/lib/mysql
#修改权限为mysql用户和组
ll /var/lib/mysql #再次查看
验证数据是否恢复
systemctl start mysqld #启动mysql
mysql -u root -plmx #登录mysql
show databases; #查看数据库
+--------------------+
| Database |
+--------------------+
| agan |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
select * from t_agan; #查看表内容
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | 孟波 | 20 |
| 2 | 周扒皮 | 25 |
| 3 | 爱博 | 23 |
| 4 | 小玉 | 19 |
+----+-----------+------+
2.9 增量备份与恢复
在全量备份的基础上备份增量备份。(全量备份:mysql-backup/full/bakup_2024-12-03_18_14_44)
ls -l /root/mysql-backup/full/
总用量 4
drwxr-x---. 7 root root 4096 12月 3 22:39 bakup_2024-12-03_18_14_44
模拟增加数据
create database test #创建数据库
mysql> create table t_test(
-> id int not null primary key auto_increment,
-> name varchar(50) not null,
-> age char(8))charset utf8mb4;
Query OK, 0 rows affected (0.00 sec) #创建表
mysql> insert test.t_test(name,age) values('阿',20),('王五',25),('张学友',25),('爱 德华',23);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0 #插入数据
mysql> select * from t_test;
+----+-----------+------+
| id | name | age |
+----+-----------+------+
| 1 | 阿 | 20 |
| 2 | 王五 | 25 |
| 3 | 张学友 | 25 |
| 4 | 爱德华 | 23 |
+----+-----------+------+
4 rows in set (0.00 sec) #查看数据
第一次备份
xtrabackup --backup --target-dir=/root/mysql-backup/bin/backup_`date +"%F_%H_%M_%S"` \
--incremental-basedir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 \
--datadir=/var/lib/mysql/ -u root -plmx -S /var/lib/mysql/mysql.sock
#新增参数:--incremental-basedir #指定全备的目录 --datadir #指定mysql数据库存放的路径
#成功会出现completed OK!
模拟第二次增加数据
show databases;
+--------------------+
| Database |
+--------------------+
| agan |
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
create database tom;#创建数据库
mysql> create table tom.t_test(
-> id int not null primary key auto_increment,
-> name varchar(50) not null,
-> age char(8))charset utf8mb4; #创建表
insert tom.t_test(name,age) values('杰克',20),('路飞',25),('索隆',23),('娜美',19); #插入数据
select * from t_test; #查看数据
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 杰克 | 20 |
| 2 | 路飞 | 25 |
| 3 | 索隆 | 23 |
| 4 | 娜美 | 19 |
+----+--------+------+
第二次增量备份
xtrabackup --backup --target-dir=/root/mysql-backup/bin/backup2 \
--incremental-basedir=/root/mysql-backup/bin/backup1 --datadir=/var/lib/mysql \
-S /var/lib/mysql/mysql.sock -u root -plmx
#成功会出现completed OK!
[root@lmx bin]# ll
总用量 8
drwxr-x---. 7 root root 4096 12月 3 23:22 backup1 #第一次增量备份
drwxr-x---. 8 root root 4096 12月 3 23:37 backup2 #第二次增量备份
[root@lmx full]# ll
总用量 4
drwxr-x---. 7 root root 4096 12月 3 22:39 bakup_2024-12-03_18_14_44 #全量备份
误删除数据
drop database tom;
drop database test;
show databases;
+--------------------+
| Database |
+--------------------+
| agan |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
恢复数据为一致性
第一次恢复
xtrabackup --prepare --apply-log-only --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44
第二次恢复
xtrabackup --prepare --apply-log-only --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 --incremental-dir=/root/mysql-backup/bin/backup1
最后一次恢复,不用加--apply-log-only
xtrabackup --prepare --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 --incremental-dir=/root/mysql-backup/bin/backup2
systemctl stop mysqld #停止数据库
mkdir -p /tmp/shujuku1 #创建目录
mv /var/lib/mysql/* /tmp/shujuku1/
#恢复实例的数据目录必须为空,所以在恢复前,我们需要清空 MySQL 数据目录,或者将其 mv 备份
ll /var/lib/mysql #确定清空,清空会显示‘总用量 0’
恢复数据
xtrabackup --copy-back --target-dir=/root/mysql-backup/full/bakup_2024-12-03_18_14_44 --user=root --password=lmx
chown -R mysql:mysql /var/lib/mysql
#由于恢复后是root用户权限,需要修改权限为mysql用户和组
报错信息:找不到sock文件
检查/etc/my.cnf sock没有错的话,指定一下sock文件就解决了
xtrabackup --backup --slave-info -u root -plmx --parallel=5 -S /var/lib/mysql/mysql.sock --target-dir=/root/mysql-backup/full/bakup_`date +"%F_%H_%M_%S"` 2>/tmp/xtrabackup.log
标签:--,backup,备份,MySQL,xtrabckup8,xtrabackup,mysqldump,mysql,root
From: https://blog.csdn.net/2301_80479959/article/details/144217534