You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

817 lines
30 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!doctype html>
<html class="no-js" lang="tw">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="Eric Chang">
<meta name="description" content="Whats the Worst That Could Happen?">
<meta name="keywords" content="linux,blog,responsive,search,font awesome,pages,posts,multilingual,highlight.js,syntax highlighting,premium,shortcuts">
<meta content="postgresql, zfs, backup, restore" name="keywords">
<meta name="generator" content="Hugo 0.50" />
<title> [筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot | MCの飄狂山莊㊣</title>
<meta name="description" content="[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot - Whats the Worst That Could Happen?">
<meta itemprop="name" content="[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot">
<meta itemprop="description" content="[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot - Whats the Worst That Could Happen?">
<meta property="og:title" content="[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot">
<meta property="og:description" content="[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot - Whats the Worst That Could Happen?">
<meta property="og:image" content="https://h.cowbay.org/images/post-default-5.jpg">
<meta property="og:url" content="https://h.cowbay.org/post/postgresql-backup-restore-using-zfs-snapshot/">
<meta property="og:site_name" content="MCの飄狂山莊㊣">
<meta property="og:type" content="article">
<link rel="icon" type="image/png" href="https://h.cowbay.org/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="https://h.cowbay.org/favicon-16x16.png" sizes="16x16">
<link rel="stylesheet" href="https://h.cowbay.org/sass/combined.min.a89dfa577f701bffe9659f476ef61241cb2a3452b913e793463b0074a10c0a59.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="bilberry-hugo-theme">
<nav class="permanentTopNav">
<div class="container">
<ul class="topnav">
</ul>
<div id="search-box" class="search">
<i class="fa fa-search"></i>
<input id="search" type="text" placeholder="">
</div>
</div>
</nav>
<header>
<div class="container">
<div class="logo">
<a href="/" class="logo">
<img src="https://www.gravatar.com/avatar/e4eb1f8e016ffb73e9889f87d16e15f0?d=mm&size=200" alt="">
<span class="overlay"><i class="fa fa-home"></i></span>
</a>
</div>
<div class="titles">
<h3 class="title"><a href="/">MCの飄狂山莊㊣</a></h3>
<span class="subtitle">Whats the Worst That Could Happen?</span>
</div>
<div class="toggler permanentTopNav">
<i class="fa fa-bars" aria-hidden="true"></i>
</div>
</div>
</header>
<div class="main container">
<div class="article-wrapper u-cf single">
<a class="bubble" href="/post/postgresql-backup-restore-using-zfs-snapshot/">
<i class="fa fa-fw fa-pencil"></i>
</a>
<article class="default article">
<div class="featured-image">
<a href="/post/postgresql-backup-restore-using-zfs-snapshot/">
<img src="/images/post-default-5.jpg" alt="">
</a>
</div>
<div class="content">
<h3><a href="/post/postgresql-backup-restore-using-zfs-snapshot/">[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot</a></h3>
<div class="meta">
<span class="date moment">2019-09-06</span>
<span class="categories">
<a href="/categories/%E7%AD%86%E8%A8%98">筆記</a>
</span>
<span class="author"><a href="/author/eric-chang">Eric Chang</a></span>
</div>
<p>前面測試了用pgbarman / pgbackrest 來備份 postgresql</p>
<p>這次改從system file level 來下手</p>
<p>採用zfs 的快照來備份、還原postgresql 資料庫</p>
<p></p>
<h3 id="建立測試資料庫-table-snapshot">建立測試資料庫、TABLE、snapshot</h3>
<h4 id="資料庫現況">資料庫現況</h4>
<p>只有系統預設的DB沒有其他多的東西</p>
<pre><code>postgres@hqdc034:~$ psql -c '\l'
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
postgres@hqdc034:~$ du -sh /zp/database/10/main/
232M /zp/database/10/main/
</code></pre>
<h4 id="建立第一次的快照">建立第一次的快照</h4>
<pre><code>2019-09-06 09:03:46 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
no datasets available
2019-09-06 09:03:53 [changch@hqdc034 ~]$ sudo zfs snapshot zp/database@init_db_no_demo
2019-09-06 09:04:09 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 0 - 231M -
2019-09-06 09:04:15 [changch@hqdc034 ~]$
</code></pre>
<h4 id="建立-倒回測試資料庫-demo">建立、倒回測試資料庫 demo</h4>
<pre><code>postgres@hqdc034:~$ createdb demo
postgres@hqdc034:~$ psql demo &lt; /home/changch/Downloads/demo.sql
SET
SET
略...
</code></pre>
<p>再檢查一次資料庫的狀況,看到 demo DB出現了資料庫目錄也變大了</p>
<pre><code>postgres@hqdc034:~$ psql -c '\l'
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
demo | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres@hqdc034:~$ du -sh /zp/database/10/main/
2.1G /zp/database/10/main/
postgres@hqdc034:~$
</code></pre>
<h4 id="建立第二次快照">建立第二次快照</h4>
<p>這次的快照,將包含剛剛倒回的 demo DB但是不包含等下才要建立的測試 table</p>
<pre><code>2019-09-06 09:16:01 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 0 - 2.08G -
2019-09-06 09:16:04 [changch@hqdc034 ~]$
</code></pre>
<h4 id="建立測試-table">建立測試 table</h4>
<pre><code>postgres@hqdc034:~$ psql -c 'create table test ( a int, b varchar(50) );'
CREATE TABLE
postgres@hqdc034:~$
</code></pre>
<h4 id="建立第三次快照">建立第三次快照</h4>
<p>這次快照,只有建立 test table ,但是裡面沒有資料</p>
<pre><code>2019-09-06 09:18:34 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 0 - 2.08G -
2019-09-06 09:18:36 [changch@hqdc034 ~]$
</code></pre>
<h4 id="在test-table-插入100萬筆資料">在test table 插入100萬筆資料</h4>
<pre><code>postgres@hqdc034:~$ psql -c 'with aa as ( select * from generate_series (1,1000000) a ) insert into test select aa.a, md5(aa.a::varchar) from aa;'
INSERT 0 1000000
postgres@hqdc034:~$ psql -c 'select count(*) from test;'
count
---------
1000000
(1 row)
postgres@hqdc034:~$
</code></pre>
<h4 id="建立第四次快照">建立第四次快照</h4>
<p>test table 內有 1000000 筆資料</p>
<pre><code>2019-09-06 09:18:36 [changch@hqdc034 ~]$ sudo zfs snapshot zp/database@demo_db_test_table_with_1M_rows
2019-09-06 09:21:08 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 116K - 2.08G -
zp/database@demo_db_test_table_with_1M_rows 0 - 2.15G -
2019-09-06 09:21:09 [changch@hqdc034 ~]$
</code></pre>
<h4 id="再次插入-100萬筆資料">再次插入 100萬筆資料</h4>
<pre><code>postgres@hqdc034:~$ time psql -c 'with aa as ( select * from generate_series (1,1000000) a ) insert into test select aa.a, md5(aa.a::varchar) from aa;'
INSERT 0 1000000
real 0m4.276s
user 0m0.020s
sys 0m0.012s
postgres@hqdc034:~$ psql -c 'select count(*) from test;'
count
---------
2000000
(1 row)
postgres@hqdc034:~$
</code></pre>
<h4 id="建立第五次快照">建立第五次快照</h4>
<p>現在 test table 有 200萬筆資料了</p>
<pre><code>2019-09-06 09:21:09 [changch@hqdc034 ~]$ sudo zfs snapshot zp/database@demo_db_test_table_with_2M_rows
2019-09-06 09:22:29 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 116K - 2.08G -
zp/database@demo_db_test_table_with_1M_rows 218K - 2.15G -
zp/database@demo_db_test_table_with_2M_rows 0 - 2.23G -
2019-09-06 09:22:30 [changch@hqdc034 ~]$
</code></pre>
<h4 id="玩大點-直接湊滿1000萬筆資料好了">玩大點直接湊滿1000萬筆資料好了</h4>
<pre><code>postgres@hqdc034:~$ time psql -c 'with aa as ( select * from generate_series (1,8000000) a ) insert into test select aa.a, md5(aa.a::varchar) from aa;'
INSERT 0 8000000
real 0m32.172s
user 0m0.024s
sys 0m0.008s
postgres@hqdc034:~$ psql -c 'select count(*) from test;'
count
----------
10000000
(1 row)
postgres@hqdc034:~$
</code></pre>
<h4 id="建立第六次快照">建立第六次快照</h4>
<p>10M rows in test table</p>
<pre><code>2019-09-06 09:22:30 [changch@hqdc034 ~]$ sudo zfs snapshot zp/database@demo_db_test_table_with_10M_rows
2019-09-06 09:25:18 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 116K - 2.08G -
zp/database@demo_db_test_table_with_1M_rows 218K - 2.15G -
zp/database@demo_db_test_table_with_2M_rows 530K - 2.23G -
zp/database@demo_db_test_table_with_10M_rows 163K - 2.97G -
2019-09-06 09:25:21 [changch@hqdc034 ~]$
</code></pre>
<p>到1000萬筆資料為止現在資料庫大小是這樣</p>
<pre><code>postgres@hqdc034:~$ du -sh /zp/database/10/main/
3.0G /zp/database/10/main/
postgres@hqdc034:~$
</code></pre>
<hr />
<h3 id="還原測試">還原測試</h3>
<p>最後一次做快照的時候demo DB 裡面有一千萬筆資料現在來砍掉500萬筆</p>
<pre><code>postgres@hqdc034:~$ time psql -c 'delete from test where a &gt; 5000000;'
DELETE 3000000
real 0m7.844s
user 0m0.024s
sys 0m0.004s
postgres@hqdc034:~$ time psql -c 'select count(*) from test;'
count
---------
7000000
(1 row)
real 0m0.268s
user 0m0.024s
sys 0m0.004s
postgres@hqdc034:~$
</code></pre>
<p>怪怪的為什麼只有砍掉300萬筆
這邊先不管等等正好來驗證restore的狀況</p>
<p>假設剛剛這個刪除是錯誤的動作我要回到1000萬資料的狀態就可以用zfs rollback 來達成</p>
<h4 id="第一次還原">第一次還原</h4>
<p>目標是還原到包含1000萬筆資料的狀態(現在是700萬筆)</p>
<pre><code>2019-09-06 09:25:21 [changch@hqdc034 ~]$ sudo service postgresql stop
* Stopping PostgreSQL 10 database server [ OK ]
2019-09-06 10:14:12 [changch@hqdc034 ~]$ sudo zfs rollback -r zp/database@demo_db_test_table_with_10M_rows
2019-09-06 10:14:28 [changch@hqdc034 ~]$ sudo service postgresql start
* Starting PostgreSQL 10 database server [ OK ]
2019-09-06 10:14:57 [changch@hqdc034 ~]$
</code></pre>
<p>檢查一下</p>
<pre><code>postgres@hqdc034:~$ time psql -c 'select count(*) from test;'
count
----------
10000000
(1 row)
real 0m5.019s
user 0m0.040s
sys 0m0.008s
postgres@hqdc034:~$
</code></pre>
<p>沒錯又回到1000萬筆資料的狀態了</p>
<p>要注意的是如果回到更之前的狀態在該狀態之後的快照將會被清除除非你先做clone
比如我現在要回到 200萬筆的狀態那1000萬筆資料的快照就會被刪除</p>
<pre><code>2019-09-06 10:17:32 [changch@hqdc034 ~]$ sudo service postgresql stop
* Stopping PostgreSQL 10 database server [ OK ]
2019-09-06 10:18:50 [changch@hqdc034 ~]$ sudo zfs rollback -r zp/database@demo_db_test_table_with_2M_rows
2019-09-06 10:18:57 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 116K - 2.08G -
zp/database@demo_db_test_table_with_1M_rows 218K - 2.15G -
zp/database@demo_db_test_table_with_2M_rows 0 - 2.23G -
2019-09-06 10:19:04 [changch@hqdc034 ~]$ sudo service postgresql start
* Starting PostgreSQL 10 database server [ OK ]
2019-09-06 10:19:17 [changch@hqdc034 ~]$
postgres@hqdc034:~$ time psql -c 'select count(*) from test;'
count
---------
2000000
(1 row)
real 0m0.175s
user 0m0.024s
sys 0m0.008s
postgres@hqdc034:~$
</code></pre>
<p>我剛剛應該先clone的&hellip;.
沒關係我們再做一次新增800萬筆資料湊齊1000萬筆然後快照</p>
<pre><code>postgres@hqdc034:~$ time psql -c 'with aa as ( select * from generate_series (1,8000000) a ) insert into test select aa.a, md5(aa.a::varchar) from aa;'
INSERT 0 8000000
real 0m35.662s
user 0m0.048s
sys 0m0.004s
postgres@hqdc034:~$ time psql -c 'select count(*) from test;'
count
----------
10000000
(1 row)
real 0m5.259s
user 0m0.024s
sys 0m0.008s
postgres@hqdc034:~$
</code></pre>
<p>做快照</p>
<pre><code>2019-09-06 10:19:17 [changch@hqdc034 ~]$ sudo zfs snapshot zp/database@demo_db_test_table_with_10M_rows
2019-09-06 10:22:59 [changch@hqdc034 ~]$ sudo zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
zp/database@init_db_no_demo 250K - 231M -
zp/database@demo_db_just_restore 138K - 2.08G -
zp/database@demo_db_create_test_table_but_no_data 116K - 2.08G -
zp/database@demo_db_test_table_with_1M_rows 218K - 2.15G -
zp/database@demo_db_test_table_with_2M_rows 56.4M - 2.23G -
zp/database@demo_db_test_table_with_10M_rows 0 - 1.81G -
2019-09-06 10:23:02 [changch@hqdc034 ~]$
</code></pre>
<p>接著來測試看看 clone snapshot這是基本的說明</p>
<pre><code>Clones can only be created from a snapshot and a snapshot can not
be deleted until you delete the clone that is based on this snapshot.
To create a clone, use the zfs clone command.
</code></pre>
<p>clone 會做出一份跟clone來源一模一樣的資料在快照模式下資料是唯讀的clone出來後就可以做異動。但是不能刪除clone來源的快照會提示錯誤。</p>
<pre><code>2019-09-06 10:28:31 [changch@hqdc034 ~]$ sudo zfs clone zp/database@demo_db_test_table_with_10M_rows zp/database/clone_with_10M_rows
2019-09-06 10:29:21 [changch@hqdc034 ~]$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
zp 3.08G 231G 22K /zp
zp/database 3.08G 231G 1.88G /zp/database
zp/database/clone_with_10M_rows 0 231G 1.81G /zp/database/clone_with_10M_rows
2019-09-06 10:29:26 [changch@hqdc034 ~]$
</code></pre>
<p>可以看到做了clone之後多了一個 zfs dataset
試試看把資料庫路徑直接改到這個新做的dataset 看看能不能啟動資料庫
修改 /etc/postgresql/10/main/postgresql.conf然後重起postgresql</p>
<pre><code>#data_directory = '/var/lib/postgresql/10/main' # use data in another directory
#data_directory = '/zp/database/10/main'
data_directory = '/zp/database/clone_with_10M_rows/10/main'
</code></pre>
<p><strong>啟動有比較久一點</strong> 而且好像沒成功啟動</p>
<pre><code>2019-09-06 10:32:27 [changch@hqdc034 ~]$ sudo service postgresql restart
* Restarting PostgreSQL 10 database server [ OK ]
2019-09-06 10:33:37 [changch@hqdc034 ~]$
2019-09-06 10:33:37 [changch@hqdc034 ~]$ sudo netstat -antlp |grep 5432
</code></pre>
<p>而且在 syslog &amp; postgresql log 中看不到什麼異常,怪了!
而且再啟動一次就好了?</p>
<p>再來測試一次看看</p>
<pre><code>2019-09-06 10:37:22 [changch@hqdc034 ~]$ sudo service postgresql stop
* Stopping PostgreSQL 10 database server [ OK ]
2019-09-06 10:38:03 [changch@hqdc034 ~]$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
zp 3.24G 231G 22K /zp
zp/database 3.24G 231G 1.88G /zp/database
zp/database/clone_with_10M_rows 165M 231G 1.88G /zp/database/clone_with_10M_rows
2019-09-06 10:38:13 [changch@hqdc034 ~]$ sudo zfs destroy zp/database/clone_with_10M_rows
2019-09-06 10:38:21 [changch@hqdc034 ~]$ sudo zfs clone zp/database@demo_db_test_table_with_10M_rows zp/database/clone_with_10M_rows
2019-09-06 10:38:32 [changch@hqdc034 ~]$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
zp 3.08G 231G 22K /zp
zp/database 3.08G 231G 1.88G /zp/database
zp/database/clone_with_10M_rows 0 231G 1.81G /zp/database/clone_with_10M_rows
2019-09-06 10:38:35 [changch@hqdc034 ~]$ sudo service postgresql start^C
2019-09-06 10:38:44 [changch@hqdc034 ~]$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
zp 3.08G 231G 22K /zp
zp/database 3.08G 231G 1.88G /zp/database
zp/database/clone_with_10M_rows 0 231G 1.81G /zp/database/clone_with_10M_rows
2019-09-06 10:38:45 [changch@hqdc034 ~]$ sudo service postgresql start
* Starting PostgreSQL 10 database server [ OK ]
2019-09-06 10:39:04 [changch@hqdc034 ~]$ netstat -antlp |grep 5432
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
2019-09-06 10:39:13 [changch@hqdc034 ~]$
</code></pre>
<p>這次就沒問題看來是我第一次下指令的時候不該用sudo netstat -antlp 去檢查?
anyway 回到psql 來看看內容</p>
<pre><code>postgres@hqdc034:~$ time psql -c 'select count(*) from test;'
count
----------
10000000
(1 row)
real 0m4.716s
user 0m0.028s
sys 0m0.004s
postgres@hqdc034:~$
</code></pre>
<p>Good clone 出來的果然是1000萬筆資料時的狀態</p>
<hr />
<p>這次測試就先到此為止後面再來測試zfs的 replication and send/recv</p>
</div>
<div class="footer">
<div class="tags">
<i class="fa fa-tags"></i>
<div class="links">
<a href="/tags/postgresql">postgresql</a>
<a href="/tags/zfs">zfs</a>
<a href="/tags/backup">backup</a>
<a href="/tags/restore">restore</a>
</div>
</div>
</div>
</article>
</div>
<div id="disqus_thread"></div>
<script type="application/javascript">
var disqus_config = function () {
};
(function() {
if (["localhost", "127.0.0.1"].indexOf(window.location.hostname) != -1) {
document.getElementById('disqus_thread').innerHTML = 'Disqus comments not available by default when the website is previewed locally.';
return;
}
var d = document, s = d.createElement('script'); s.async = true;
s.src = '//' + "h-cowbay-org-1" + '.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="https://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
<footer>
<div class="container">
<div class="recent-posts">
<strong></strong>
<ul>
<li>
<a href="/post/pg_auto_failover_in_ubuntu_1804_psql_11/">[筆記] 在ubuntu 18.04安裝psql 11 以及 pg_auto_failover / install psql 11 and pg_auto_failover in ubuntu 18.04</a>
</li>
<li>
<a href="/post/bencmark-with-external-internal-nvme-ssd-and-external-sata-ssd/">[筆記] 測試 USB 3.1 Gen2 NVME SSD 外接盒 &amp; 內建pci-e ssd &amp; 外接SATA SSD / Bencmark With External Internal Nvme Ssd and External Sata Ssd</a>
</li>
<li>
<a href="/post/postgresql-backup-restore-using-zfs-snapshot/">[筆記] 用zfs的snapshot 快照功能來做 postgresql 的備份還原 / Postgresql Backup Restore Using Zfs Snapshot</a>
</li>
<li>
<a href="/post/backup-restore-postgresql-with-pgbackrest/">[筆記] 用pbackrest 備份還原 postgresql / Backup Restore Postgresql With Pgbackrest</a>
</li>
<li>
<a href="/post/pgbarman-in-ubuntu-1804-postgresql-10-via-ssh/">[筆記] 在Ubuntu 18.04 下 透過 pgbarman rsync/ssh backup 備份 postgresql 10 / backup postgresql 10 with pgbarman via ssh/rsync in ubuntu 18.04</a>
</li>
<li>
<a href="/post/pgbarman-in-ubuntu-1804-postgresql-10/">[筆記] 在Ubuntu 18.04 下 透過 pgbarman streaming backup 備份 postgresql 10/ backup postgresql 10 with pgbarman straming backup in ubuntu 18.04</a>
</li>
<li>
<a href="/post/install-nvidia-driver-cuda-pgstrom-in-ubuntu-1804/">[筆記] 在ubuntu 18.04 下安裝nvidia 顯示卡驅動程式以及 pgstrom / Install Nvidia Driver Cuda Pgstrom in Ubuntu 1804</a>
</li>
</ul>
</div>
<div class="categories">
<a href="/categories/"><strong></strong></a>
<ul>
<li>
<a href="/categories/%E7%AD%86%E8%A8%98">筆記 (31)</a>
</li>
<li>
<a href="/categories/ansible">Ansible (3)</a>
</li>
<li>
<a href="/categories/linux">Linux (1)</a>
</li>
<li>
<a href="/categories/proxmox">Proxmox (1)</a>
</li>
<li>
<a href="/categories/ps">Ps (1)</a>
</li>
<li>
<a href="/categories/%E7%A2%8E%E5%BF%B5">碎念 (1)</a>
</li>
<li>
<a href="/categories/%E7%BE%A4%E6%9A%89">群暉 (1)</a>
</li>
</ul>
</div>
<div class="right">
<div class="external-profiles">
<strong></strong>
<a href="https://www.facebook.com/mariahchang" target="_blank"><i class="fa fa-facebook-adblock-proof"></i></a>
<a href="https://twitter.com/changchichung" target="_blank"><i class="fa fa-twitter-adblock-proof"></i></a>
<a href="https://github.com/changchichung" target="_blank"><i class="fa fa-github"></i></a>
<a href="https://www.yapee.tw/mvc/onlinePay/webLink?key=lMC74kucH21JChCR77-wJ80ZZ-Poh11amP24BwiDdHw" target="_blank"><img border="0" src="https://www.yapee.tw/mvc/file/publicFile?pathType=data/linkLogo/B0S0F0002585.jpg"></img></a>
</div>
</div>
</div>
</footer>
<div class="credits">
<div class="container">
<div class="copyright">
<a href="https://github.com/Lednerb" target="_blank">
&copy;
2017
by Lednerb
</a>
</div>
<div class="author">
<a href="https://www.yapee.tw/mvc/onlinePay/webLink?key=lMC74kucH21JChCR77-wJ80ZZ-Poh11amP24BwiDdHw" target="_blank">Bilberry Hugo Theme</a>
</div>
</div>
</div>
<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-138954876-1', 'auto');
ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<script type="text/javascript" src="https://h.cowbay.org/js/externalDependencies.39c47e10e241eae2947b3fe21809c572.js" integrity="md5-OcR&#43;EOJB6uKUez/iGAnFcg=="></script>
<script type="text/javascript" src="https://h.cowbay.org/js/theme.ff50ae6dc1bfc220b23bf69dbb41b54e.js" integrity="md5-/1CubcG/wiCyO/adu0G1Tg=="></script>
<script>
$(".moment").each(function() {
$(this).text(
moment( $(this).text() )
.locale( "tw" )
.format('LL')
);
});
$(".footnote-return sup").html("");
</script>
<script>
var client = algoliasearch("2XL0P8XDCY", "4ef65b37b627bb886b46c34a10e63aa6");
var index = client.initIndex("h_cowbay_org");
$('#search').autocomplete({ hint: false, autoselect: true, debug: false },
[
{
source: $.fn.autocomplete.sources.hits(index, { hitsPerPage: 10 }),
displayKey: function(suggestion) {
return suggestion.title || suggestion.author
},
templates: {
suggestion: function(suggestion) {
return "<span class='entry " + suggestion.type + "'>"
+ "<span class='title'>" + suggestion.title + "</span>"
+ "<span class='fa fa-fw " + suggestion.iconClass + "'></span>"
+ "</span>"
;
},
empty: function() {
return "<span class='empty'></span>"
},
footer: function() {
return '<div class="branding">Powered by <img src="https:\/\/h.cowbay.org\/dist\/algolia-logo-light.svg" /></div>'
}
},
}
])
.on('autocomplete:selected', function(event, suggestion, dataset) {
window.location = (suggestion.url);
})
.keypress(function (event, suggestion) {
if (event.which == 13) {
window.location = (suggestion.url);
}
});
</script>
</body>
</html>