首页 文章 精选 留言 我的

精选列表

搜索[热搜算法],共10004篇文章
优秀的个人博客,低调大师

Cordova 实现热更新

文章来源 http://blog.csdn.net/zhuzhiqiang_zhu/article/details/53608398 一、添加插件 说明:在这个步骤里面,以下的命令需要在项目根目录下执行 ● 新建Cordova项目 ○ cordova create CordovaHotCode com.ezample.hotcode ● 添加android平台 ○ cordova platform add android ● 添加iOS平台 ○ cordova platform add ios ● 添加自动更新插件 ○ cordova plugin add cordova-hot-code-push-plugin ● 添加cordova hot code push客户端,用于生成www目录下文件的hash码,更新的时候对比使用。(注意:安装过就不用在安装了) ○ npm install -g cordova-hot-code-push-cli 二、配置 修改config.xml ○ iOS工程的地址 config.xml的路径是:projectName/platforms/ios/projectName/config.xml 其中 projectName 是我们创建的工程名称 ○ Android工程的地址是 projectName/platforms/android/res/xml/config.xml 修改内容如图: 417114801036.png //代码为 <chcp> <auto-download enabled="true" /> <auto-install enabled="true" /> <config-file url="http://172.16.1.245:8080/cordova-hot-update/cordova/www/chcp.json" /> </chcp> 转移项目根目录下的www目录里的内容 ○ ios平台 将www里面的内容拷贝到 projectName/platforms/ios/projectName/www ○ Android平台 将www里面的内容拷贝到 projectName/platforms/android/assets/www 为了chcp.json文件生成的方便,我们需要在项目的根目录下新建一个文件cordova-hcp.json,内容为: { "update": "start", "content_url": "http://192.168.40.203:8080/cordova/www" } 上面执行完之后,可以将项目导入到android studio中或者直接在根目录执行cordova build,然后在CordovaHotCode\platforms\android\build\outputs\apk这个目录下生成了apk文件,直接安装就行。 三、服务器端配置 服务器端就比较简单了,我们修改项目根目录下的www目录之后,在根目录下执行cordova-hcp build. 直接把根目录下的www目录拷贝到服务器中,注意地址不要写错。然后启动我们的app,第一次启动的时候检查更新并下载更新,第二次启动的时候就会使用更新的版本。 213130800190.png

优秀的个人博客,低调大师

Android VirtualApk热修复

1. VirtualApk项目地址 下载并解压后的目录结构如下,其中PluginDemo是官方写的一个示例 图1.png 2. 使用Android Studio直接打开VirtualAPK-master项目 运行项目将其安装至手机上。安装成功之后,在VirtualAPK-master/app/build/VAHost/文件夹下生成如下文件 图2.png 3. 打开PluginDemo工程 在Android Studio中使用Terminal命令行工具,执行gradlew clean assemblePlugin 执行后如果报如下错误: * What went wrong: A problem occurred configuring project ':app'. > The directory of host application doesn't exist! Dir: F:\source\Program\VirtualAPK-master\VirtualAPK-master\PluginDemo\..\..\VirtualAPK\app 解决方法为: 进入/app/build.gradle中,找到virtualApk节点 图2.png 将其中的targetHost的值更改为"../app",更改后如下图: 图3.png gradle同步后,再次使用Terminal工具执行 gradlew clean assemblePlugin,执行成功后,在/app/build/outputs/plugin文件夹下生成如下文件 图4.png 4. 导入SDCard 将beijingRelease或者shanghaiRelease文件夹下的apk复制到手机的/sdcard/路径下,并命名为Test.apk。 使用adb push命令推入 adb push F:\source\Program\VirtualAPK-master\VirtualAPK-master\PluginDemo\app\build\outputs\plugin\beijingRelease\com.didi.virtualapk.demo_20180102163314.apk \sdcard\Test.apk 5. 测试 打开VirtualAPK,点击加载插件,如果成功跳转到一个新的Activity,则说明加载插件成功。 图5.png

优秀的个人博客,低调大师

Android Tinker热修复

1. tinker项目地址 下载并解压后的目录结构如下,其中tinker-sample-android是官方写的一个示例 图1.png 2. 使用Android Studio直接打开此示例 打开后Gradle依赖会出现问题,将其注释后继续同步,直到出现如下错误: Error:Execution failed for task ':app:tinkerProcessDebugManifest'. > tinkerId is not set!!! 图2.png 3. 解决tinkerId is not set!!! 打开/tinker-master/tinker-sample-android/app/的build.gradle文件,找到gitSha()方法,将gitRev变量的值设置为一个常量,修改后如图4. 图3.png 图4.png 4. 打debug包 使用gradlew assembleDebug命令打一个debug的包,成功运行后在/app/build/目录下生成一个bakApk文件夹,并在bakApk文件夹下生成形如app-debug-时间.apk与app-debug-时间-R.txt文件,可能会更多,但我这里就只有两个,如下图: 图5.png 5. 文件内容修改 将app-debug-1228-17-15-24.apk的文件名中的时间1228-17-15-24复制,找到/tinker-master/tinker-sample-android/app/的build.gradle的ext函数块(如图6),并将图6中的红色框中的时间全部替换为刚刚所复制的时间,修改后同步工程。 图6.png 6. 生成patch包 使用gradlew tinkerPatchDebug命令生成patch包,此包的路径为/app/build/outputs/tinkerPatch/debug/目录。 图7.png 7. 将上一步生成的patch_signed_7zip.apk包放在手机的内存卡目录下(/sdcard/) 使用命令直接推送 adb push ./app/build/outputs/tinkerPatch/debug/patch_signed_7zip.apk /storage/sdcard0/ 8. 测试 打开示例后,点击LOAD PATCH,显示出Toast的内容为"patch success, please restart process", 即代表加载成功,此时需要重启app,点击KILL SELF,然后再次打开app,点击SHOW INFO即可显示如下内容 图8.png

优秀的个人博客,低调大师

Android热修复技术

更新版本一直以来是移动端的一大痛点,各大公司也推出了相应的解决方案。 1)AndFix(阿里巴巴):兼容性不太好,亲试过,上线反馈崩溃问题特别严重。 2)Tinker(微信):集成起来是相当的麻烦 看完http://blog.csdn.net/u010983881/article/details/53196574这个链接,基本就能接入了。 但是还有一些需要补充的 1》Android的一些编译打包命令:http://blog.csdn.net/dakaring/article/details/44944139 2》怎么保留自己的Application:http://blog.csdn.net/cao126197103/article/details/54693760 3》Tinker id is not set错误:(将tinker id写死,如果没有使用git管理代码就会出现此问题) 4》加载补丁包失败,通过tinker过滤日志,查看失败原因。有时也要结合源码 5》Tinker多渠道打包:https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97#%E5%A4%9Aflavor%E6%89%93%E5%8C%85 6》常见问题:http://blog.csdn.net/tyk9999tyk/article/details/53391519 7》TinkerInstaller.install(this) Tinker instance is already set的问题 http://www.jianshu.com/p/9680a58e67fe 8》使用了Tinker的项目,在运行的时候无法使用Instant-Run。 线上应用的问题: 1)app如果打了一次补丁,再从市场上更新app,点击桌面应用图标,app启动不起来。(巨坑!!) 后来给Tinker项目提了个issue,才得知我把tinkerid写死了。tinkerid应该每个版本都不一样 比如3.3.7更新了补丁,到了3.3.8版本,然后从市场更新到了3.3.9版本。这3个版本的tinkerid要两两互不一样。否则就会出现以上问题。 2) 本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1929242,如需转载请自行联系原作者

优秀的个人博客,低调大师

openstack实例热迁移

[DEFAULT]scheduler_default_filters=AllHostsFilterallow_resize_to_same_host=Trueallow_migrate_to_same_host=Truecpu_allocation_ration=158.5memory_allocation_ration=158.5max_cores=164start_guests_on_host_boot = Trueresume_guests_state_on_host_boot=Truerpc_backend = rabbitauth_strategy = keystonemy_ip = 192.168.11.152network_api_class = nova.network.neutronv2.api.APIsecurity_group_api = neutronlinuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriverfirewall_driver = nova.virt.firewall.NoopFirewallDriverdhcpbridge_flagfile=/etc/nova/nova.confdhcpbridge=/usr/bin/nova-dhcpbridgelogdir=/var/log/novastate_path=/var/lib/novalock_path=/var/lock/novaforce_dhcp_release=Truelibvirt_use_virtio_for_bridges=Trueverbose=Trueec2_private_dns_show_ip=Trueapi_paste_config=/etc/nova/api-paste.inienabled_apis=ec2,osapi_compute,metadata[oslo_messaging_rabbit]rabbit_host = ahwater-cloud-controllerrabbit_userid = openstackrabbit_password = 321[keystone_authtoken]auth_uri = http://ahwater-cloud-controller:5000auth_url = http://ahwater-cloud-controller:35357auth_plugin = passwordproject_domain_id = defaultuser_domain_id = defaultproject_name = serviceusername = novapassword = 321[vnc]enabled = Truevncserver_listen = 0.0.0.0vncserver_proxyclient_address = $my_ip#novncproxy_base_url = http://ahwater-cloud-controller:6080/vnc_auto.htmlnovncproxy_base_url = http://192.168.11.150:6080/vnc_auto.html[glance]host = ahwater-cloud-controller[oslo_concurrency]lock_path = /var/lib/nova/tmp[neutron]url = http://ahwater-cloud-controller:9696auth_url = http://ahwater-cloud-controller:35357auth_plugin = passwordproject_domain_id = defaultuser_domain_id = defaultregion_name = RegionOneproject_name = serviceusername = neutronpassword = 321

优秀的个人博客,低调大师

Stack Overflow 引入 CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题,有时候需要查询的结果中有通俗的讲解,而且最好还能够带上代码 demo,但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术,或许可以解决这一问题。 新技术名叫 CROKAGE(Crowd Knowledge Answer Generator,群众知识答案生成器),它来源于今年早些时候一个计算机科学研究小组发表的一篇论文,CROKAGE 可以将提问作为查询,然后返回相关的、全面的编程解决方案,所谓全面,就是说它不仅有代码片段,还包括简洁的自然语言解释,这样开发者就不用在众多的答案中拼凑出一个解决方案。 CROKAGE 使用Stack Overflow 上的数百万个 Q&A 作为训练语料库进行训练,还扩展了自然语言查询(任务描述),包括从 Stack Overflow 中仔细挖掘出来的独特的开源软件库和功能术语。 对于返回来的候选答案,研究人员组合了四个加权因子进行排序,他们利用传统的信息检索(IR)指标,如TF-IDF和非对称相关性,同时为了适应 Stack Overflow 的环境,还采用了非常适合软件特定文档的针对性排序机制。 简单来讲,整个运作机制如前边的图片所示,主要分为几个步骤: A、语料库准备 B、构建模型,map、索引 C、搜索相关答案 D、整合编程解决方案 研究团队还对结果进行了对比,如下图所示,在对比中,CROKAGE 给出的建议答案中,代码示例的相关性、代码解释的清晰度以及整体解决方案的质量(也就是代码+解释的整体质量),比目前最先进的工具产出了更好的结果。 目前 CROKAGE 还有一些局限性,比如它仅支持 Java 语言的相关查询,而且如果问题描述比较差,那工具也无法给出如何改进的建议。 开发者可以通过http://www.isel.ufu.br:9000体验该功能。 关于该功能的更多信息,查看: https://stackoverflow.blog/2019/08/14/crokage-a-new-way-to-search-stack-overflow https://dl.acm.org/citation.cfm?id=3339130

优秀的个人博客,低调大师

Percona XtraBackup热备份实践

实验环境及操作步骤: 一、操作系统 [root@DB-SERVER~]#cat/etc/redhat-release CentOSrelease6.8(Final) [root@DB-SERVER~]#uname-a LinuxDB-SERVER2.6.32-642.el6.x86_64#1SMPTueMay1017:27:01UTC2016x86_64x86_64x86_64GNU/Linux [root@DB-SERVER~]# 二、MySQL和percona版本及安装 [root@DB-SERVERtools]#ll total5 -rw-r--r--1rootroot5691656Apr52015cmake-2.8.8.tar.gz -rw-r--r--1rootroot24596474Apr52015mysql-5.5.32.tar.gz -rw-r--r--1rootroot5664452Oct172015percona-xtrabackup-2.3.2-1.el6.x86_64.rpm [root@DB-SERVERtools]# ①MySQL安装 [root@DB-SERVER~]#cd/opt/tools/ [root@DB-SERVERtools]#tarxfcmake-2.8.8.tar.gz [root@DB-SERVERcmake-2.8.8]#./configure [root@DB-SERVERcmake-2.8.8]#gmake [root@DB-SERVERcmake-2.8.8]#gmakeinstall [root@DB-SERVERcmake-2.8.8]#cd.. [root@DB-SERVERtools]#yuminstallncurses-devel-y [root@DB-SERVERtools]#groupaddmysql [root@DB-SERVERtools]#useraddmysql-s/sbin/nologin-M-gmysql [root@DB-SERVERtools]#tarzxfmysql-5.5.32.tar.gz [root@DB-SERVERtools]#cdmysql-5.5.32 [root@DB-SERVERmysql-5.5.32]# cmake.-DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32\ -DMYSQL_DATADIR=/application/mysql-5.5.32/data\ -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock\ -DDEFAULT_CHARSET=utf8\ -DDEFAULT_COLLATION=utf8_general_ci\ -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii\ -DENABLED_LOCAL_INFILE=ON\ -DWITH_INNOBASE_STORAGE_ENGINE=1\ -DWITH_FEDERATED_STORAGE_ENGINE=1\ -DWITH_BLACKHOLE_STORAGE_ENGINE=1\ -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1\ -DWITHOUT_PARTITION_STORAGE_ENGINE=1\ -DWITH_FAST_MUTEXES=1\ -DWITH_ZLIB=bundled\ -DENABLED_LOCAL_INFILE=1\ -DWITH_READLINE=1\ -DWITH_EMBEDDED_SERVER=1\ -DWITH_DEBUG=0 [root@DB-SERVERmysql-5.5.32]#make&&makeinstall [root@DB-SERVERmysql-5.5.32]#cd.. [root@DB-SERVERtools]#cpmysql-5.5.32/support-files/my-small.cnf/etc/my.cnf [root@DB-SERVERtools]#echo'exportPATH=/application/mysql/bin:$PATH'>>/etc/profile [root@DB-SERVERtools]#chown-Rmysql:mysql/application/mysql/data/ [root@DB-SERVERtools]#cd/application/mysql/scripts/ [root@DB-SERVERscripts]#./mysql_install_db--basedir=/application/mysql--datadir=/application/mysql/data/--user=mysql [root@DB-SERVERscripts]#cd/opt/tools/mysql-5.5.32 [root@DB-SERVERmysql-5.5.32]#cpsupport-files/mysql.server/etc/init.d/mysqld [root@DB-SERVERmysql-5.5.32]#chmod+x/etc/init.d/mysqld [root@DB-SERVERmysql-5.5.32]#netstat-lntup|grep3306tcp000.0.0.0:33060.0.0.0:*LISTEN18591/mysqld[root@DB-SERVERmysql-5.5.32]# MySQL配置文件为: [client] port=3306 socket=/application/mysql-5.5.32/tmp/mysql.sock [mysqld] port=3306 socket=/application/mysql-5.5.32/tmp/mysql.sock datadir=/application/mysql-5.5.32/data basedir=/application/mysql-5.5.32 tmpdir=/application/mysql-5.5.32/tmp skip-external-locking key_buffer_size=16K max_allowed_packet=1M table_open_cache=4 sort_buffer_size=64K read_buffer_size=256K read_rnd_buffer_size=256K net_buffer_length=2K thread_stack=128K innodb_log_file_size=256M#没有这个参数恢复后启动会报错,所以这里设置下innodb_log_file_size=256 server-id=1 [mysqldump] quick max_allowed_packet=16M [mysql] no-auto-rehash [myisamchk] key_buffer_size=8M sort_buffer_size=8M [mysqlhotcopy] interactive-timeout 鉴于没有设置innodb_log_file_size出现错误为: InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 解决方法: 对于使用了默认 my.cnf(一般教程都会教你使用support-files/my-medium.cnf)的Mysql服务来说 如果中间使用了innodb的话,innodb默认的log file大小是56M 如果你的配置文件使用了类似my-innodb-heavy-4G.cnf作为配置文件的话。 Mysql可以正常启动,但innodb的表无法使用 在错误日志里你会看到如下输出: InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 现在需要做的事情就是把原来的 innodb 的ib_logfile×备份到一个目录下,然后删除掉原来的文件,重启 mysql。 你会看到ib_logfile*大小变成了你配置文件中指定的大小。 my-innodb-heavy-4G.cnf的话(log file 的大小是256M:innodb_log_file_size = 256M) 你会看到很多个268435456大小的文件。 所以我在MySQL的配置文件中使用了该参数,并设置为256M 修改root登陆了密码: [root@DB-SERVERmysql-5.5.32]#/application/mysql/bin/mysqladmin-urootpassword'new-password' [root@DB-SERVERmysql-5.5.32]# ②percona的安装 [root@DB-SERVER~]#cd/opt/tools/ [root@DB-SERVERtools]#wgethttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.2/binary/redhat/6/x86_64/percona-xtrabackup-2.3.2-1.el6.x86_64.rpm [root@DB-SERVERtools]# 安装依赖库 [root@DB-SERVERtools]#yum-yinstallperlperl-devellibaiolibaio-develperl-Time-HiResperl-DBD-MySQL [root@DB-SERVERtools]#wgetftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm [root@DB-SERVERtools]#rpm-ivhlibev-4.15-1.el6.rf.x86_64.rpm [root@DB-SERVERtools]#rpm-ivhpercona-xtrabackup-2.3.2-1.el6.x86_64.rpm [root@DB-SERVERtools]#mkdir-p/databackup/xtrabackup [root@DB-SERVERtools]#mkdir-p/databackup/xtrabackuplog [root@DB-SERVERtools] ③创建用于实践的数据库并插入数据 CREATEDATABASEopark; CREATETABLE`person`( `number`int(11)DEFAULTNULL, `name`varchar(255)DEFAULTNULL, `birthday`dateDEFAULTNULL )ENGINE=INNODBDEFAULTCHARSET=utf8; INSERTINTOperson(number,name,birthday)VALUES("0001","JohnPoul",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0002","JohnHock",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0003","RickHock",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0004","Rickstone",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0005","JohnGreen",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0006","JohnHalk",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0007","Rickrose",NOW()); INSERTINTOperson(number,name,birthday)VALUES("0008","Rickkate",NOW()); mysql>showdatabases; +--------------------+ |Database| +--------------------+ |information_schema| |mysql| |opark| |performance_schema| |test| +--------------------+ 5rowsinset(0.00sec) mysql>useopark; Databasechanged mysql>select*fromperson; +--------+------------+------------+ |number|name|birthday| +--------+------------+------------+ |1|JohnPoul|2016-09-18| |2|JohnHock|2016-09-18| |3|RickHock|2016-09-18| |4|Rickstone|2016-09-18| |5|JohnGreen|2016-09-18| |6|JohnHalk|2016-09-18| |7|Rickrose|2016-09-18| |8|Rickkate|2016-09-18| +--------+------------+------------+ 8rowsinset(0.01sec) mysql> ④创建备份用户和授权 mysql>grantSELECT,RELOAD,SHOWDATABASES,SUPER,LOCKTABLES,REPLICATIONCLIENT,SHOWVIEW,EVENT,FILEon*.*tobackup@'localhost'identifiedby'MANAGER'; 三、实战备份操作 (1)全备与恢复 ①.全备操作 [root@DB-SERVER~]#cd/databackup/ [root@DB-SERVERdatabackup]#ll total4 drwx------6rootroot4096Sep1801:402016-09-18_01-40-28 [root@DB-SERVERdatabackup]# [root@DB-SERVERdatabackup]#innobackupex--user=backup--password='MANAGER'/databackup/ 16091802:48:10innobackupex:Startingthebackupoperation IMPORTANT:Pleasecheckthatthebackupruncompletessuccessfully. Attheendofasuccessfulbackupruninnobackupex prints"completedOK!". 16091802:48:13Backupcreatedindirectory'/databackup//2016-09-18_02-48-10' 16091802:48:13[00]Writingbackup-my.cnf 16091802:48:13[00]...done 16091802:48:13[00]Writingxtrabackup_info 16091802:48:13[00]...done xtrabackup:Transactionlogoflsn(1609238)to(1609238)wascopied. 16091802:48:13completedOK! [root@DB-SERVERdatabackup]# [root@DB-SERVERdatabackup]#ll total8 drwx------6rootroot4096Sep1801:402016-09-18_01-40-28 drwx------6rootroot4096Sep1802:482016-09-18_02-48-10 [root@DB-SERVERdatabackup]# ②.全备恢复操作 对于一般恢复,都是直接用备份文件还原,如果我们这里也是直接运用该备份文件,则可能会导致一些意想不到的问题,比如:备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件处于不一致的状态,我们现在就是要通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。所以我们要用如下命令进行检查 [root@DB-SERVERdatabackup]#innobackupex--apply-log/databackup/2016-09-18_02-48-10/ InnoDB:128rollbacksegment(s)areactive. InnoDB:Waitingforpurgetostart InnoDB:5.6.24started;logsequencenumber1609740 xtrabackup:startingshutdownwithinnodb_fast_shutdown=1 InnoDB:FTSoptimizethreadexiting. InnoDB:Startingshutdown... InnoDB:Shutdowncompleted;logsequencenumber1609750 16091802:53:59completedOK! [root@DB-SERVERdatabackup]# 关闭数据库,模拟数据丢失,可以将MySQL的数据目录删除,我们这里为了演示方便,直接把数据目录改名 [root@DB-SERVER~]#/etc/init.d/mysldstop ShuttingdownMySQL.SUCCESS! [root@DB-SERVER~]#cd/application/mysql-5.5.32/ [root@DB-SERVERmysql-5.5.32]#ll total84 drwxr-xr-x2mysqlmysql4096Sep1723:36bin -rw-r--r--1mysqlmysql17987Jul22013COPYING drwx------6mysqlmysql4096Sep1802:54data drwxr-xr-x6mysqlmysql4096Sep1801:40data.backup drwxr-xr-x2mysqlmysql4096Sep1723:36docs drwxr-xr-x3mysqlmysql4096Sep1723:36include -rw-r--r--1mysqlmysql7470Jul22013INSTALL-BINARY drwxr-xr-x3mysqlmysql4096Sep1723:36lib drwxr-xr-x4mysqlmysql4096Sep1723:36man drwxr-xr-x10mysqlmysql4096Sep1723:36mysql-test -rw-r--r--1mysqlmysql2496Jul22013README drwxr-xr-x2mysqlmysql4096Sep1723:36scripts drwxr-xr-x27mysqlmysql4096Sep1723:36share drwxr-xr-x4mysqlmysql4096Sep1723:36sql-bench drwxr-xr-x3mysqlmysql4096Sep1723:36support-files drwxr-xr-x2mysqlroot4096Sep1802:54tmp [root@DB-SERVERmysql-5.5.32]#mvdatadata.backup [root@DB-SERVERmysql-5.5.32]#mkdirdata [root@DB-SERVERmysql-5.5.32]# [root@DB-SERVERmysql-5.5.32]#lldata total2 [root@DB-SERVERmysql-5.5.32]# 目录data下没有数据,接下来执行恢复操作 [root@DB-SERVERdatabackup]#innobackupex--copy-back/databackup/2016-09-18_02-48-10/ 16091802:57:41innobackupex:Startingthecopy-backoperation IMPORTANT:Pleasecheckthatthecopy-backruncompletessuccessfully. Attheendofasuccessfulcopy-backruninnobackupex prints"completedOK!". innobackupexversion2.3.2basedonMySQLserver5.6.24Linux(x86_64)(revisionid:306a2e0) 16091802:57:41[01]Copyingib_logfile0to/application/mysql-5.5.32/data/ib_logfile0 16091802:57:41[01]...done 16091802:57:42[01]Copying./opark/db.optto/application/mysql-5.5.32/data/opark/db.opt 16091802:57:42[01]...done 16091802:57:42[01]Copying./test/db.optto/application/mysql-5.5.32/data/test/db.opt 16091802:57:42[01]...done 16091802:57:42completedOK! [root@DB-SERVERdatabackup]# 再看MySQL数据目录,数据目录data下数据已经过来了 [root@DB-SERVERmysql-5.5.32]#lldata total116756 -rw-r-----1rootroot18874368Sep1802:57ibdata1 -rw-r-----1rootroot50331648Sep1802:57ib_logfile0 -rw-r-----1rootroot50331648Sep1802:57ib_logfile1 drwx------2rootroot4096Sep1802:57mysql drwx------2rootroot4096Sep1802:57opark drwx------2rootroot4096Sep1802:57performance_schema drwx------2rootroot4096Sep1802:57test -rw-r-----1rootroot429Sep1802:57xtrabackup_info [root@DB-SERVERmysql-5.5.32]# 启动数据库 [root@DB-SERVERmysql-5.5.32]#/etc/init.d/mysldstart StartingMySQL.ERROR!TheserverquitwithoutupdatingPIDfile(/application/mysql-5.5.32/data/DB-SERVER.pid). 进一步查看错误日志: [root@DB-SERVERdata]#catDB-SERVER.err 16091818:04:18mysqld_safeStartingmysqlddaemonwithdatabasesfrom/application/mysql-5.5.32/data 16091818:04:18[Note]Plugin'FEDERATED'isdisabled. /application/mysql-5.5.32/bin/mysqld:Can'tfindfile:'./mysql/plugin.frm'(errno:13) 16091818:04:18[ERROR]Can'topenthemysql.plugintable.Pleaserunmysql_upgradetocreateit. 16091818:04:18InnoDB:TheInnoDBmemoryheapisdisabled 16091818:04:18InnoDB:Mutexesandrw_locksuseGCCatomicbuiltins 16091818:04:18InnoDB:Compressedtablesusezlib1.2.3 16091818:04:18InnoDB:Initializingbufferpool,size=128.0M 16091818:04:18InnoDB:Completedinitializationofbufferpool 16091818:04:18InnoDB:Operatingsystemerrornumber13inafileoperation. InnoDB:Theerrormeansmysqlddoesnothavetheaccessrightsto InnoDB:thedirectory. InnoDB:Filename./ibdata1 InnoDB:Fileoperationcall:'open'. InnoDB:Cannotcontinueoperation. 16091818:04:18mysqld_safemysqldfrompidfile/application/mysql-5.5.32/data/DB-SERVER.pidended [root@DB-SERVERmysql-5.5.32]# 出现这样的错误一般就是data目录下的数据用户名和和属组不是mysql,所以这里修改下: [root@DB-SERVERmysql-5.5.32]#chown-Rmysql.mysqldata [root@DB-SERVERmysql-5.5.32]#lldata total116760 -rw-r-----1mysqlmysql1025Sep1803:00DB-SERVER.err -rw-r-----1mysqlmysql18874368Sep1802:57ibdata1 -rw-r-----1mysqlmysql50331648Sep1802:57ib_logfile0 -rw-r-----1mysqlmysql50331648Sep1802:57ib_logfile1 drwx------2mysqlmysql4096Sep1802:57mysql drwx------2mysqlmysql4096Sep1802:57opark drwx------2mysqlmysql4096Sep1802:57performance_schema drwx------2mysqlmysql4096Sep1802:57test -rw-r-----1mysqlmysql429Sep1802:57xtrabackup_info [root@DB-SERVERmysql-5.5.32]# 再启动运行/etc/init.d/mysqld start [root@DB-SERVERmysql-5.5.32]#/etc/init.d/mysldstart StartingMySQL..SUCCESS! [root@DB-SERVERmysql-5.5.32]#mysql-uroot-proot-hlocalhost WelcometotheMySQLmonitor.Commandsendwith;or\g. YourMySQLconnectionidis1 Serverversion:5.5.32Sourcedistribution Copyright(c)2000,2013,Oracleand/oritsaffiliates.Allrightsreserved. OracleisaregisteredtrademarkofOracleCorporationand/orits affiliates.Othernamesmaybetrademarksoftheirrespective owners. Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement. mysql>showdatabases; +--------------------+ |Database| +--------------------+ |information_schema| |mysql| |opark| |performance_schema| |test| +--------------------+ 5rowsinset(0.00sec) mysql>useopark; Databasechanged mysql>select*fromperson; +--------+------------+------------+ |number|name|birthday| +--------+------------+------------+ |1|JohnPoul|2016-09-18| |2|JohnHock|2016-09-18| |3|RickHock|2016-09-18| |4|Rickstone|2016-09-18| |5|JohnGreen|2016-09-18| |6|JohnHalk|2016-09-18| |7|Rickrose|2016-09-18| |8|Rickkate|2016-09-18| +--------+------------+------------+ 8rowsinset(0.00sec) mysql> 说明: innobackup的--copy-back选项用于执行恢复操作,它是通过复制所有数据相关文件至MySQL数据目录,因此,需要清空数据目录。我这里是将其重命名,然后再重建目录。最主要最后一步是将其权限更改 (2).增量备份 innobackupex --user=backup --password='MANAGER' --incremental /databackup/incrementdir --incremental-basedir=/databackup/2016-09-18_03-35-06/ ①.向数据库中添加数据: INSERT INTO person (number,name,birthday) VALUES ("0009", "Reh Hat", NOW()); INSERT INTO person (number,name,birthday) VALUES ("0010", "pyhton study", NOW()); INSERT INTO person (number,name,birthday) VALUES ("0008", "Linux system", NOW()); mysql>select*fromperson; +--------+--------------+------------+ |number|name|birthday| +--------+--------------+------------+ |1|JohnPoul|2016-09-18| |2|JohnHock|2016-09-18| |3|RickHock|2016-09-18| |4|Rickstone|2016-09-18| |5|JohnGreen|2016-09-18| |6|JohnHalk|2016-09-18| |7|Rickrose|2016-09-18| |8|Rickkate|2016-09-18| |9|RehHat|2016-09-18| |10|pyhtonstudy|2016-09-18| |8|Linuxsystem|2016-09-18| +--------+--------------+------------+ 11rowsinset(0.00sec) ②.删除数据 mysql>deletefromopark.personwherename="RehHat"; QueryOK,1rowaffected(0.01sec) mysql>select*fromperson; +--------+--------------+------------+ |number|name|birthday| +--------+--------------+------------+ |1|JohnPoul|2016-09-18| |2|JohnHock|2016-09-18| |3|RickHock|2016-09-18| |4|Rickstone|2016-09-18| |5|JohnGreen|2016-09-18| |6|JohnHalk|2016-09-18| |7|Rickrose|2016-09-18| |8|Rickkate|2016-09-18| |10|pyhtonstudy|2016-09-18| |8|Linuxsystem|2016-09-18| +--------+--------------+------------+ 10rowsinset(0.00sec) mysql> [root@DB-SERVERdatabackup]#innobackupex--user=backup--password='MANAGER'--incremental/databackup/incrementdir--incremental-basedir=/databackup/2016-09-18_03-09-33 16091803:23:25ExecutingUNLOCKTABLES 16091803:23:25Alltablesunlocked 16091803:23:25Backupcreatedindirectory'/databackup/incrementdir/2016-09-18_03-23-22' 16091803:23:25[00]Writingbackup-my.cnf 16091803:23:25[00]...done 16091803:23:25[00]Writingxtrabackup_info 16091803:23:25[00]...done xtrabackup:Transactionlogoflsn(1611092)to(1611092)wascopied. 16091803:23:25completedOK! [root@DB-SERVERdatabackup]# [root@DB-SERVERdatabackup]#llincrementdir/ total4 drwx------6rootroot4096Sep1803:232016-09-18_03-23-22 [root@DB-SERVERdatabackup]#ll total24 drwx------6rootroot4096Sep1801:402016-09-18_01-40-28 drwx------6rootroot4096Sep1802:532016-09-18_02-48-10 drwx------6rootroot4096Sep1803:052016-09-18_03-05-15 drwx------6rootroot4096Sep1803:092016-09-18_03-09-33 drwxr-xr-x3rootroot4096Sep1803:23incrementdir drwxr-xr-x2rootroot4096Sep1803:16xtrabackuplog [root@DB-SERVERdatabackup]# 其中,--incremental-basedir指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/data/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。 需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。 ③.增量备份的恢复,如果需要恢复的话需要做如下操作 [root@DB-SERVERdatabackup]#innobackupex--apply-log--redo-only/databackup/2016-09-18_03-35-06/ [root@DB-SERVERdatabackup]#innobackupex--apply-log--redo-only/databackup/2016-09-18_03-35-06/--incremental-dir=/databackup/incrementdir/2016-09-18_03-38-06/ 如果存在多次增量备份的话,就需要多次执行.如 [root@DB-SERVER~]#innobackupex--apply-log--redo-onlyBACKUPDIR [root@DB-SERVER~]#innobackupex--apply-log--redo-onlyBACKUPDIR--incremental-dir=INCREMENTDIR-1 [root@DB-SERVER~]#innobackupex--apply-log--redo-onlyBACKUPDIR--incremental-dir=INCREMENTDIR-2 BACKUP是全备目录,INCREMENTDIR是增量备份目录,上面是有2次增量备份,如果存在多次增量备份,则需要多次运行如上的命令 另外一种增量恢复方式为:分别将多次的增量备份依次合并到全量备份中,最后执行全量恢复,比如: [root@DB-SERVER~]#innobackupex--apply-log--redo-only--incremental/databackup/2016-09-18_03-35-06/--incremental-dir=/databackup/incrementdir/2016-09-18_03-55-12/ [root@DB-SERVER~]#innobackupex--apply-log--redo-only--incremental/databackup/2016-09-18_03-35-06/--incremental-dir=/databackup/incrementdir/2016-09-18_04-11-30/ [root@DB-SERVER~]#innobackupex--apply-log--redo-only--incremental/databackup/2016-09-18_03-35-06/--incremental-dir=/databackup/incrementdir/2016-09-18_04-17-11/ [root@DB-SERVER~]#innobackupex--apply-log--redo-only/databackup/2016-09-18_03-35-06/ 其中:2016-09-18_03-35-06是全备,后面的2016-09-18_03-55-12、2016-09-18_04-11-30、2016-09-18_04-17-11为增量备份 (3).Xtrabackup的备份压缩 Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如: 1 innobackupex --user=backup --password='MANAGER' --stream=tar /databackup/ | gzip > /databackup/`date +%F_%H-%M-%S`.tar.gz

优秀的个人博客,低调大师

Java算法-排序算法

冒泡排序 方法sort是基本的冒泡排序, sort1/sort2是冒泡排序的两种优化 package me.zx.algorithm.program.sort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 冒泡排序. * Created by zhangxin on 2017/12/27. * * @author zhangxin * @since 0.0.1 */ public final class BubbleSort { private static final Logger LOGGER = LoggerFactory.getLogger(BubbleSort.class); /** * 基本的冒泡排序. * @param a 待排序数组 */ public static void sort(int[] a) { int temp = 0; for(int i = a.length - 1; i > 0; i--) { for(int j = 0; j < i; j++) { if(a[j + 1] < a[j]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } /** * 优化的冒泡排序1. * 当某一趟遍历没有交换,就说明已经遍历好了,就不用再迭代了 * @param a 待排序数组 */ public static void sort1(int[] a) { int temp = 0; boolean sorted = false; for(int i = a.length - 1; i > 0; i--) { sorted = false; //初始值设置为未排序 for(int j = 0; j < i; j++) { if(a[j + 1] < a[j]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; sorted = true; //发生排序时重新设值 } } if(!sorted){ //当经过一次遍历没有发生一次排序, 或者上次排序位置与本次排序位置相同 break; } } } /** * 优化的冒泡排序2. * 记录每次遍历数据之后交换次序的位置,显然这个位置之后的数据已经有序了不用再排序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了 * @param a 待排序数组 */ public static void sort2(int[] a) { int temp = 0; int lastChangeLocation; //上次排序发生的位置 int nowChangeLocation = a.length - 1; //本次排序发生的位置 for(int i = a.length - 1; i > 0; i--) { lastChangeLocation = nowChangeLocation; for(int j = 0; j < i; j++) { if(a[j + 1] < a[j]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; nowChangeLocation = j; //发生排序时重新设值 } } if(lastChangeLocation == nowChangeLocation){ //当经过一次遍历没有发生一次排序, 或者上次排序位置与本次排序位置相同 break; } } } public static void main(final String[] args){ // int[] a = {0, 1, 2, 3, 4, 5, 6}; int[] a = {6, 5, 4, 3, 2, 1, 0}; LOGGER.info("原数组:{}", a); sort1(a); LOGGER.info("现数组:{}", a); } }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册