1 |
702
|
aaronmk
|
Installation:
|
2 |
|
|
Install: make install
|
3 |
3370
|
aaronmk
|
WARNING: This will delete the current public schema of your VegBIEN DB!
|
4 |
702
|
aaronmk
|
Uninstall: make uninstall
|
5 |
3370
|
aaronmk
|
WARNING: This will delete your entire VegBIEN DB!
|
6 |
3374
|
aaronmk
|
This includes all archived imports and staging tables.
|
7 |
554
|
aaronmk
|
|
8 |
3674
|
aaronmk
|
Maintenance:
|
9 |
|
|
Important: Whenever you install a system update that affects PostgreSQL or
|
10 |
|
|
any of its dependencies, such as libc, you should restart the PostgreSQL
|
11 |
|
|
server. Otherwise, you may get strange errors like "the database system
|
12 |
|
|
is in recovery mode" which go away upon reimport.
|
13 |
|
|
|
14 |
702
|
aaronmk
|
Data import:
|
15 |
4487
|
aaronmk
|
On local machine:
|
16 |
|
|
make test by_col=1
|
17 |
5016
|
aaronmk
|
See note under Testing below
|
18 |
4487
|
aaronmk
|
On vegbiendev:
|
19 |
4482
|
aaronmk
|
svn up
|
20 |
6059
|
aaronmk
|
make inputs/upload
|
21 |
|
|
For each newly-uploaded datasource: make inputs/<datasrc>/reinstall
|
22 |
4482
|
aaronmk
|
Update the schemas: make schemas/reinstall
|
23 |
|
|
WARNING: This will delete the current public schema of your VegBIEN DB!
|
24 |
|
|
To save it: make schemas/rotate
|
25 |
5206
|
aaronmk
|
Start column-based import: . bin/import_all by_col=1
|
26 |
|
|
To use row-based import: . bin/import_all
|
27 |
4481
|
aaronmk
|
To stop all running imports: . bin/stop_imports
|
28 |
5318
|
aaronmk
|
WARNING: Do NOT run import_all in the background, or the jobs it creates
|
29 |
|
|
won't be owned by your shell.
|
30 |
5563
|
aaronmk
|
Note that import_all will several hours to import the NCBI backbone and
|
31 |
|
|
TNRS names before returning control to the shell.
|
32 |
4481
|
aaronmk
|
Wait (overnight) for the import to finish
|
33 |
6103
|
aaronmk
|
tail inputs/{.,}*/*/logs/*.r<revision>[.-]*log.sql
|
34 |
|
|
Check that every input's log ends in "Encountered 0 error(s)"
|
35 |
|
|
If many do not, fix the bug and discard the current (partial) import:
|
36 |
|
|
make schemas/public/reinstall
|
37 |
|
|
Otherwise, continue
|
38 |
6105
|
aaronmk
|
Determine the import name:
|
39 |
|
|
bin/import_name inputs/{.,}*/*/logs/*.r<revision>[.-]*log.sql
|
40 |
|
|
Archive the last import: make schemas/rename/public.<import_name>
|
41 |
4481
|
aaronmk
|
Delete previous imports so they won't bloat the full DB backup:
|
42 |
5461
|
aaronmk
|
make backups/public.<version>.backup/remove
|
43 |
5917
|
aaronmk
|
make backups/TNRS.backup-remake &
|
44 |
5461
|
aaronmk
|
make backups/public.<version>.backup/test &
|
45 |
|
|
make backups/vegbien.<version>.backup/test &
|
46 |
4481
|
aaronmk
|
On local machine:
|
47 |
6049
|
aaronmk
|
make inputs/download-logs
|
48 |
4623
|
aaronmk
|
make backups/download
|
49 |
4677
|
aaronmk
|
If desired, record the import times in inputs/import.stats.xls:
|
50 |
|
|
Open inputs/import.stats.xls
|
51 |
|
|
Insert a copy of the leftmost Column-based column group before it
|
52 |
|
|
Update the import date in the upper-right corner
|
53 |
5461
|
aaronmk
|
./bin/import_times inputs/{.,}*/*/logs/*.r<revision>[.-]*log.sql
|
54 |
4677
|
aaronmk
|
Paste the output over the # Rows/Time columns, making sure that the
|
55 |
|
|
row counts match up with the previous import's row counts
|
56 |
|
|
If the row counts do not match up, insert or reorder rows as needed
|
57 |
|
|
until they do
|
58 |
4777
|
aaronmk
|
Commit: svn ci -m "inputs/import.stats.xls: Updated import times"
|
59 |
6367
|
aaronmk
|
To remake analytical DB: env public=... bin/make_analytical_db &
|
60 |
|
|
public should be set to the current import's schema name
|
61 |
6212
|
aaronmk
|
To view progress:
|
62 |
|
|
tail -f inputs/analytical_db/logs/make_analytical_db.log.sql
|
63 |
3381
|
aaronmk
|
|
64 |
3545
|
aaronmk
|
Backups:
|
65 |
3408
|
aaronmk
|
Archived imports:
|
66 |
|
|
Back up: make backups/public.<date>.backup &
|
67 |
3546
|
aaronmk
|
Note: To back up the last import, you must archive it first (above)
|
68 |
3410
|
aaronmk
|
Test: make backups/public.<date>.backup/test &
|
69 |
3408
|
aaronmk
|
Restore: make backups/public.<date>.backup/restore &
|
70 |
|
|
Remove: make backups/public.<date>.backup/remove
|
71 |
3701
|
aaronmk
|
Download: make backups/download
|
72 |
5801
|
aaronmk
|
TNRS cache:
|
73 |
|
|
Back up: make backups/TNRS.backup-remake &
|
74 |
|
|
Restore:
|
75 |
|
|
yes|make inputs/.TNRS/uninstall
|
76 |
|
|
make backups/TNRS.backup/restore &
|
77 |
|
|
yes|make schemas/public/reinstall
|
78 |
|
|
Must come after TNRS restore to recreate tnrs_input_name view
|
79 |
3408
|
aaronmk
|
Full DB:
|
80 |
3546
|
aaronmk
|
Back up, test, and rotate: make backups/vegbien.backup/all &
|
81 |
3439
|
aaronmk
|
Back up and rotate: make backups/vegbien.backup/rotate &
|
82 |
|
|
Test: make backups/vegbien.<date>.backup/test &
|
83 |
|
|
Restore: make backups/vegbien.<date>.backup/restore &
|
84 |
3701
|
aaronmk
|
Download: make backups/download
|
85 |
3698
|
aaronmk
|
Import logs:
|
86 |
|
|
Download: make inputs/download-logs
|
87 |
554
|
aaronmk
|
|
88 |
1773
|
aaronmk
|
Datasource setup:
|
89 |
4219
|
aaronmk
|
Add a new datasource: make inputs/<datasrc>/add
|
90 |
|
|
<datasrc> may not contain spaces, and should be abbreviated.
|
91 |
|
|
If the datasource is a herbarium, <datasrc> should be the herbarium code
|
92 |
|
|
as defined by the Index Herbariorum <http://sweetgum.nybg.org/ih/>
|
93 |
6366
|
aaronmk
|
For MySQL inputs (exports and live DB connections):
|
94 |
|
|
For .sql exports:
|
95 |
|
|
Place the original .sql file in _src/ (*not* in _MySQL/)
|
96 |
|
|
Create a database for the MySQL export in phpMyAdmin
|
97 |
|
|
mysql -p database <inputs/<datasrc>/_src/export.sql
|
98 |
|
|
mkdir inputs/<datasrc>/_MySQL/
|
99 |
|
|
cp -p lib/MySQL.{data,schema}.sql.make inputs/<datasrc>/_MySQL/
|
100 |
|
|
Edit _MySQL/*.make for the DB connection
|
101 |
|
|
For a .sql export, use your local MySQL DB
|
102 |
6372
|
aaronmk
|
Install the export according to Install the staging tables below
|
103 |
4218
|
aaronmk
|
Add input data for each table present in the datasource:
|
104 |
6365
|
aaronmk
|
For .sql exports, you must use the name of the table in the DB export
|
105 |
|
|
For CSV files, you can use any name. It's recommended to use a table
|
106 |
|
|
name from <https://projects.nceas.ucsb.edu/nceas/projects/bien/wiki/VegCSV#Suggested-table-names>
|
107 |
4264
|
aaronmk
|
Note that if this table will be joined together with another table, its
|
108 |
|
|
name must end in ".src"
|
109 |
4219
|
aaronmk
|
make inputs/<datasrc>/<table>/add
|
110 |
4342
|
aaronmk
|
Important: DO NOT just create an empty directory named <table>!
|
111 |
|
|
This command also creates necessary subdirs, such as logs/.
|
112 |
6373
|
aaronmk
|
If the table is in a .sql export: make inputs/<datasrc>/<table>/install
|
113 |
|
|
Otherwise, place the CSV(s) for the table in
|
114 |
6370
|
aaronmk
|
inputs/<datasrc>/<table>/ OR place a query joining other tables
|
115 |
|
|
together in inputs/<datasrc>/<table>/create.sql
|
116 |
4212
|
aaronmk
|
Important: When exporting relational databases to CSVs, you MUST ensure
|
117 |
|
|
that embedded quotes are escaped by doubling them, *not* by
|
118 |
|
|
preceding them with a "\" as is the default in phpMyAdmin
|
119 |
3612
|
aaronmk
|
If there are multiple part files for a table, and the header is repeated
|
120 |
|
|
in each part, make sure each header is EXACTLY the same.
|
121 |
|
|
(If the headers are not the same, the CSV concatenation script
|
122 |
|
|
assumes the part files don't have individual headers and treats the
|
123 |
|
|
subsequent headers as data rows.)
|
124 |
4255
|
aaronmk
|
Add <table> to inputs/<datasrc>/import_order.txt before other tables
|
125 |
4220
|
aaronmk
|
that depend on it
|
126 |
3611
|
aaronmk
|
Install the staging tables:
|
127 |
4219
|
aaronmk
|
make inputs/<datasrc>/reinstall quiet=1 &
|
128 |
|
|
To view progress: tail -f inputs/<datasrc>/<table>/logs/install.log.sql
|
129 |
|
|
View the logs: tail -n +1 inputs/<datasrc>/*/logs/install.log.sql
|
130 |
3611
|
aaronmk
|
tail provides a header line with the filename
|
131 |
|
|
+1 starts at the first line, to show the whole file
|
132 |
|
|
For every file with an error 'column "..." specified more than once':
|
133 |
4182
|
aaronmk
|
Add a header override file "+header.<ext>" in <table>/:
|
134 |
3611
|
aaronmk
|
Note: The leading "+" should sort it before the flat files.
|
135 |
|
|
"_" unfortunately sorts *after* capital letters in ASCII.
|
136 |
|
|
Create a text file containing the header line of the flat files
|
137 |
|
|
Add an ! at the beginning of the line
|
138 |
|
|
This signals cat_csv that this is a header override.
|
139 |
|
|
For empty names, use their 0-based column # (by convention)
|
140 |
|
|
For duplicate names, add a distinguishing suffix
|
141 |
|
|
For long names that collided, rename them to <= 63 chars long
|
142 |
|
|
Do NOT make readability changes in this step; that is what the
|
143 |
|
|
map spreadsheets (below) are for.
|
144 |
|
|
Save
|
145 |
|
|
If you made any changes, re-run the install command above
|
146 |
6015
|
aaronmk
|
Auto-create the map spreadsheets: make inputs/<datasrc>/
|
147 |
3576
|
aaronmk
|
Map each table's columns:
|
148 |
4125
|
aaronmk
|
In each <table>/ subdir, for each "via map" map.csv:
|
149 |
3576
|
aaronmk
|
Open the map in a spreadsheet editor
|
150 |
4125
|
aaronmk
|
Open the "core map" /mappings/Veg+-VegBIEN.csv
|
151 |
3576
|
aaronmk
|
In each row of the via map, set the right column to a value from the
|
152 |
|
|
left column of the core map
|
153 |
|
|
Save
|
154 |
4219
|
aaronmk
|
Regenerate the derived maps: make inputs/<datasrc>/
|
155 |
3593
|
aaronmk
|
Accept the test cases:
|
156 |
4219
|
aaronmk
|
make inputs/<datasrc>/test
|
157 |
3593
|
aaronmk
|
When prompted to "Accept new test output", enter y and press ENTER
|
158 |
3690
|
aaronmk
|
If you instead get errors, do one of the following for each one:
|
159 |
|
|
- If the error was due to a bug, fix it
|
160 |
|
|
- Add a SQL function that filters or transforms the invalid data
|
161 |
|
|
- Make an empty mapping for the columns that produced the error.
|
162 |
|
|
Put something in the Comments column of the map spreadsheet to
|
163 |
|
|
prevent the automatic mapper from auto-removing the mapping.
|
164 |
3783
|
aaronmk
|
When accepting tests, it's helpful to use WinMerge
|
165 |
|
|
(see WinMerge setup below for configuration)
|
166 |
4476
|
aaronmk
|
make inputs/<datasrc>/test by_col=1
|
167 |
|
|
If you get errors this time, this always indicates a bug, usually in
|
168 |
6368
|
aaronmk
|
the VegBIEN unique constraints or column-based import itself
|
169 |
5881
|
aaronmk
|
Add newly-created files: make inputs/<datasrc>/add
|
170 |
4219
|
aaronmk
|
Commit: svn ci -m "Added inputs/<datasrc>/" inputs/<datasrc>/
|
171 |
3585
|
aaronmk
|
Update vegbiendev:
|
172 |
|
|
On vegbiendev: svn up
|
173 |
|
|
On local machine: make inputs/upload
|
174 |
4291
|
aaronmk
|
On vegbiendev:
|
175 |
|
|
Follow the steps under Install the staging tables above
|
176 |
|
|
make inputs/<datasrc>/test
|
177 |
1773
|
aaronmk
|
|
178 |
702
|
aaronmk
|
Schema changes:
|
179 |
5227
|
aaronmk
|
Remember to update the following files with any renamings:
|
180 |
|
|
schemas/filter_ERD.csv
|
181 |
|
|
mappings/VegCore-VegBIEN.csv
|
182 |
6058
|
aaronmk
|
mappings/verify.*.sql
|
183 |
702
|
aaronmk
|
Regenerate schema from installed DB: make schemas/remake
|
184 |
1967
|
aaronmk
|
Reinstall DB from schema: make schemas/reinstall
|
185 |
3370
|
aaronmk
|
WARNING: This will delete the current public schema of your VegBIEN DB!
|
186 |
3589
|
aaronmk
|
Reinstall staging tables: . bin/reinstall_all
|
187 |
702
|
aaronmk
|
Sync ERD with vegbien.sql schema:
|
188 |
|
|
Run make schemas/vegbien.my.sql
|
189 |
|
|
Open schemas/vegbien.ERD.mwb in MySQLWorkbench
|
190 |
|
|
Go to File > Export > Synchronize With SQL CREATE Script...
|
191 |
|
|
For Input File, select schemas/vegbien.my.sql
|
192 |
|
|
Click Continue
|
193 |
6369
|
aaronmk
|
In the changes list, select each table with an arrow next to it
|
194 |
702
|
aaronmk
|
Click Update Model
|
195 |
|
|
Click Continue
|
196 |
|
|
Note: The generated SQL script will be empty because we are syncing in
|
197 |
|
|
the opposite direction
|
198 |
|
|
Click Execute
|
199 |
|
|
Reposition any lines that have been reset
|
200 |
|
|
Add any new tables by dragging them from the Catalog in the left sidebar
|
201 |
|
|
to the diagram
|
202 |
|
|
Remove any deleted tables by right-clicking the table's diagram element,
|
203 |
|
|
selecting Delete '<table name>', and clicking Delete
|
204 |
|
|
Save
|
205 |
1774
|
aaronmk
|
If desired, update the graphical ERD exports (see below)
|
206 |
|
|
Update graphical ERD exports:
|
207 |
702
|
aaronmk
|
Go to File > Export > Export as PNG...
|
208 |
1774
|
aaronmk
|
Select schemas/vegbien.ERD.png and click Save
|
209 |
702
|
aaronmk
|
Go to File > Export > Export as SVG...
|
210 |
1774
|
aaronmk
|
Select schemas/vegbien.ERD.svg and click Save
|
211 |
702
|
aaronmk
|
Go to File > Export > Export as Single Page PDF...
|
212 |
4087
|
aaronmk
|
Select schemas/vegbien.ERD.1_pg.pdf and click Save
|
213 |
1774
|
aaronmk
|
Go to File > Print...
|
214 |
|
|
In the lower left corner, click PDF > Save as PDF...
|
215 |
|
|
Set the Title and Author to ""
|
216 |
4087
|
aaronmk
|
Select schemas/vegbien.ERD.pdf and click Save
|
217 |
5226
|
aaronmk
|
Refactoring tips:
|
218 |
|
|
To rename a table:
|
219 |
|
|
In vegbien.sql, do the following:
|
220 |
|
|
Replace regexp (?<=_|\b)<old>(?=_|\b) with <new>
|
221 |
|
|
This is necessary because the table name is *everywhere*
|
222 |
|
|
Search for <new>
|
223 |
|
|
Manually change back any replacements inside comments
|
224 |
|
|
To rename a column:
|
225 |
|
|
Rename the column: ALTER TABLE <table> RENAME <old> TO <new>;
|
226 |
|
|
Recreate any foreign key for the column, removing CONSTRAINT <name>
|
227 |
|
|
This resets the foreign key name using the new column name
|
228 |
6320
|
aaronmk
|
Creating a poster of the ERD:
|
229 |
6326
|
aaronmk
|
Determine the poster size:
|
230 |
6320
|
aaronmk
|
Measure the line height (from the bottom of one line to the bottom
|
231 |
|
|
of another): 16.3cm/24 lines = 0.679cm
|
232 |
|
|
Measure the height of the ERD: 35.4cm*2 = 70.8cm
|
233 |
|
|
Zoom in as far as possible
|
234 |
|
|
Measure the height of a capital letter: 3.5mm
|
235 |
|
|
Measure the line height: 8.5mm
|
236 |
|
|
Calculate the text's fraction of the line height: 3.5mm/8.5mm = 0.41
|
237 |
|
|
Calculate the text height: 0.679cm*0.41 = 0.28cm
|
238 |
|
|
Calculate the text height's fraction of the ERD height:
|
239 |
|
|
0.28cm/70.8cm = 0.0040
|
240 |
|
|
Measure the text height on the *VegBank* ERD poster: 5.5mm = 0.55cm
|
241 |
|
|
Calculate the VegBIEN poster height to make the text the same size:
|
242 |
|
|
0.55cm/0.0040 = 137.5cm H; *1in/2.54cm = 54.1in H
|
243 |
|
|
The ERD aspect ratio is 11 in W x (2*8.5in H) = 11x17 portrait
|
244 |
|
|
Calculate the VegBIEN poster width: 54.1in H*11W/17H = 35.0in W
|
245 |
|
|
The minimum VegBIEN poster size is 35x54in portrait
|
246 |
6327
|
aaronmk
|
Determine the cost:
|
247 |
|
|
The FedEx Kinkos near NCEAS (1030 State St, Santa Barbara, CA 93101)
|
248 |
|
|
charges the following for posters:
|
249 |
|
|
base: $7.25/sq ft
|
250 |
|
|
lamination: $3/sq ft
|
251 |
|
|
mounting on a board: $8/sq ft
|
252 |
203
|
aaronmk
|
|
253 |
1459
|
aaronmk
|
Testing:
|
254 |
|
|
Mapping process: make test
|
255 |
4292
|
aaronmk
|
Including column-based import: make test by_col=1
|
256 |
4985
|
aaronmk
|
If the row-based and column-based imports produce different inserted
|
257 |
|
|
row counts, this usually means that a table is underconstrained
|
258 |
|
|
(the unique indexes don't cover all possible rows).
|
259 |
|
|
This can occur if you didn't use COALESCE(field, null_value) around
|
260 |
|
|
a nullable field in a unique index. See sql_gen.null_sentinels for
|
261 |
|
|
the appropriate null value to use.
|
262 |
1459
|
aaronmk
|
Map spreadsheet generation: make remake
|
263 |
1744
|
aaronmk
|
Missing mappings: make missing_mappings
|
264 |
1459
|
aaronmk
|
Everything (for most complete coverage): make test-all
|
265 |
702
|
aaronmk
|
|
266 |
3783
|
aaronmk
|
WinMerge setup:
|
267 |
|
|
Install WinMerge from <http://winmerge.org/>
|
268 |
3785
|
aaronmk
|
Open WinMerge
|
269 |
|
|
Go to Edit > Options and click Compare in the left sidebar
|
270 |
3783
|
aaronmk
|
Enable "Moved block detection", as described at
|
271 |
|
|
<http://manual.winmerge.org/Configuration.html#d0e5892>.
|
272 |
3784
|
aaronmk
|
Set Whitespace to Ignore change, as described at
|
273 |
|
|
<http://manual.winmerge.org/Configuration.html#d0e5758>.
|
274 |
3783
|
aaronmk
|
|
275 |
3133
|
aaronmk
|
Documentation:
|
276 |
|
|
To generate a Redmine-formatted list of steps for column-based import:
|
277 |
6291
|
aaronmk
|
make inputs/ACAD/Specimen/logs/steps.by_col.log.sql
|
278 |
5210
|
aaronmk
|
To import and scrub just the test taxonomic names:
|
279 |
5415
|
aaronmk
|
inputs/test_taxonomic_names/test_scrub
|
280 |
3133
|
aaronmk
|
|
281 |
702
|
aaronmk
|
General:
|
282 |
|
|
To see a program's description, read its top-of-file comment
|
283 |
|
|
To see a program's usage, run it without arguments
|
284 |
3389
|
aaronmk
|
To remake a directory: make <dir>/remake
|
285 |
|
|
To remake a file: make <file>-remake
|