/ on a source means "contents of"; trailing / on a destination is required when restoring multiple objects. Replace SERVERNAME with the dsm.sys stanza you want (e.g. BC01_FILE for individual file restores, BC01_MFULL / BC01_YFULL for point-in-time from full backups). All examples use absolute paths — TSM does not interpret relative paths the way shell does. -pick opens an interactive picker; -pitdate / -pittime are for scripted point-in-time. -inactive shows expired/old versions; without it you only see the current active version.
| Command | Description |
|---|---|
| Interactive — multiple commands per session | |
| dsmc -servername=BC01_FILE | Open dsmc prompt against a specific stanza |
| dsmc> q sched | Show schedules associated with this node |
| dsmc> q mgmt | Show active management classes and their bindings |
| dsmc> q backup /etc/passwd | Show backup versions of a file |
| dsmc> q filespace | List filespaces backed up for this node |
| dsmc> quit | Exit the dsmc prompt |
| One-shot — single command, returns to shell | |
| dsmc restore /etc/hosts -servername=BC01_FILE | Single restore command, exits when done |
| dsmc q backup /etc/hosts -servername=BC01_FILE | Single query, exits — useful in scripts |
dsmc -servername=…) so you can inspect q backup output before committing to the restore. One-shot mode is for scripted/automated work where you already know exactly what you want.| Command | Description |
|---|---|
| Filespaces & backups overview | |
| q filespace | List all filespaces backed up for this node |
| q filespace -detail | Show last backup time and capacity per filespace |
| q backup /etc/ | List active backup versions in /etc/ |
| q backup /etc/ -inactive | List active AND inactive (expired) versions |
| q backup /etc/ -subdir=yes | Recurse into subdirectories |
| q backup /etc/hosts -inactive | All known versions of a single file |
| Point-in-time discovery | |
| q backup /db/data/ -inactive -subdir=yes | Find a date that has the version you need |
| q backup / -inactive -fromdate=07/01/2025 -todate=07/15/2025 | Bracket the search to a date range |
q backup -inactive tells you what point-in-time versions exist before you commit to a restore. The output's "Backup Date" column is the timestamp you'll feed into -pitdate.| Command | Description |
|---|---|
| Whole directory back to original location | |
| restore /etc/ -subdir=yes -replace=all | Restore /etc and everything below it, overwriting |
| restore /home/ -subdir=yes -replace=no | Restore but skip files that already exist |
| restore /var/log/ -subdir=yes -replace=prompt | Prompt per file before overwriting |
| Subdirectory only | |
| restore /home/jim/ -subdir=yes -replace=all | Restore one user's directory, recursive |
| restore /home/jim/docs/ -subdir=yes | Even deeper — only the docs/ subtree |
| restore /home/jim/* -subdir=no | Only files directly in /home/jim, no subdirs |
| Restore directory to an alternative location | |
| restore /home/jim/ /tmp/restore/jim/ -subdir=yes | Source → destination — note trailing / on dest |
| restore /etc/ /restore_staging/etc/ -subdir=yes -replace=all | Restore /etc to a staging area for review |
| restore /db/ /restore/db_2025-08-01/ -subdir=yes -pitdate=08/01/2025 | PIT restore to alternative location for diff |
restore /etc/ /tmp/etc/ places the contents of /etc into /tmp/etc. restore /etc /tmp/etc (no trailing slashes) would create /tmp/etc/etc — usually not what you want. -subdir=yes is required for recursive restores; without it only the explicitly named directory's immediate contents come back.| Command | Description |
|---|---|
| Single file back to original | |
| restore /etc/hosts | Most recent active version, original location |
| restore /etc/hosts -replace=all | Overwrite without prompting |
| restore /etc/passwd -ifnewer | Only restore if backup is newer than local copy |
| Multiple files via wildcard | |
| restore "/var/log/*.log" | All .log files — quote to prevent shell glob |
| restore "/var/log/*" -subdir=no | Everything directly in /var/log, no recursion |
| restore "/etc/network/*.conf" | Pattern match within a directory |
| Single file to alternative location | |
| restore /etc/hosts /tmp/hosts.recovered | Rename on restore — different filename allowed |
| restore /etc/hosts /tmp/ | Same filename, different directory (note trailing /) |
| restore /db/conf/db.cfg /tmp/restore/db.cfg.20250801 | Restore + rename in one step |
| Multiple files to alternative directory | |
| restore "/var/log/*.log" /tmp/log_restore/ | All matching files into staging dir |
| restore /etc/ /tmp/etc_recovery/ -subdir=yes -replace=all | Whole tree to alternative — review then move |
restore /var/log/*.log without quotes lets the AIX shell expand the glob against the local filesystem first — meaning if /var/log is missing the .log files (which is why you're restoring them), the command becomes restore with no arguments. Quoting passes the pattern verbatim to dsmc, which then matches it against the server-side backup catalog.| Command | Description |
|---|---|
| Point-in-time by date — scripted, no prompts | |
| restore /db/ -subdir=yes -pitdate=08/01/2025 | Restore /db tree as it existed on 1 Aug 2025 (00:00:00) |
| restore /db/ -subdir=yes -pitdate=08/01/2025 -pittime=14:30:00 | PIT to a specific time of day |
| restore /etc/hosts -pitdate=07/15/2025 | Single file as of a date |
| restore /db/ /restore/db_pit/ -subdir=yes -pitdate=08/01/2025 | PIT restore to alternative location |
| Date format | |
| -pitdate=MM/DD/YYYY | US format — TSM default. Locale-dependent |
| -dateformat=4 -pitdate=2025-08-01 | Force ISO format with -dateformat=4 |
| -timeformat=1 -pittime=14:30:00 | 24-hour clock with -timeformat=1 |
| Choosing the right stanza for PIT | |
| dsmc restore … -pitdate=… -servername=BC01_FILE | From file-level node — PIT within last 30 days |
| dsmc restore … -pitdate=… -servername=BC01_MFULL | From monthly node — PIT within last 6 months |
| dsmc restore … -pitdate=… -servername=BC01_YFULL | From yearly node — PIT within last 7 years |
-pitdate tells TSM "give me the version that was active as of this date." If the file existed on that date, you get the version backed up most recently before that date. If the file was deleted before that date, you get nothing — the file's last known version had already aged out by your PIT marker. Always run q backup … -inactive first to confirm versions exist around your target date.| Command | Description |
|---|---|
| Pick from available versions | |
| restore /etc/hosts -pick | Open picker showing all active versions |
| restore /etc/hosts -pick -inactive | Include inactive (expired) versions in picker |
| restore /db/ -subdir=yes -pick -inactive | Pick versions across a recursive restore |
| restore /home/jim/ -pick -inactive -fromdate=07/01/2025 | Filter picker to versions after a date |
| Picker controls (inside the picker UI) | |
| x | Mark/unmark current line for restore |
| up / down arrows | Navigate the version list |
| = (equals) | Mark all entries |
| 0 (zero) | Clear all marks |
| o | OK / proceed with marked entries |
| c | Cancel without restoring |
-pitdate / -pittime so the recovery is reproducible. -pick always implies an interactive terminal — won't work in non-interactive scripts.| Command | Description |
|---|---|
| Cross-node access — server-side authorisation required first | |
| (server) UPDATE NODE BC01_FILE NEWNODENAME=BC01_FILE_OLD | Rename old/dead node so you can re-register |
| (server) GRANT PROXYNODE TARGET=BC01_FILE_OLD AGENT=BC02_FILE | Allow BC02_FILE to access BC01_FILE_OLD's data |
| (server) UPDATE NODE BC01_FILE_OLD HLADDRESS=<BC02_IP> | If using -fromnode, set source node's HL addr |
| Run the restore on BC02 against BC01_FILE_OLD's data | |
| dsmc restore -fromnode=BC01_FILE_OLD /home/jim/ /restore/jim/ -subdir=yes | Pull old BC01 data onto BC02 — fully authoritative recovery |
| dsmc restore -fromnode=BC01_FILE_OLD -pitdate=07/15/2025 / -subdir=yes | PIT restore from another node's backups |
| dsmc q backup -fromnode=BC01_FILE_OLD /home/ | Inspect the other node's backups before restoring |
/restore/...) first, validate, then move into place.| Command | Description |
|---|---|
| Discovery — what image backups exist | |
| dsmc q image | List active image backups for this node |
| dsmc q image -inactive | Include inactive (older) image backups |
| dsmc q image /db | Image backups of a specific filesystem |
| Restore to original filesystem | |
| dsmc rest image /db | Restore most recent active image of /db |
| dsmc rest image /db -deletefiles | Remove files added since backup (true mirror) |
| dsmc rest image /db -incremental | Restore image + incrementals on top — full PIT |
| Restore to alternative target — different LV / mountpoint | |
| dsmc rest image /db /restore_db | Source filespace → alternative mountpoint |
| dsmc rest image /db /dev/lv_recover | Restore directly to a raw LV — must be same size |
| Point-in-time image restore | |
| dsmc rest image /db -pitdate=07/01/2025 | Image as it existed on a specific date |
| dsmc rest image /db -pitdate=07/01/2025 -pittime=22:00:00 | PIT to specific time |
| Interactive picker for image restores | |
| dsmc rest image /db -pick | Pick from available image versions |
| dsmc rest image /db -pick -inactive | Pick from active + inactive image versions |
umount /db) — otherwise you'll corrupt active data. The target LV must be at least the size of the original. Image restore is block-level — it overwrites the entire filesystem, including files you didn't want to touch. Use -incremental if you want image + post-backup file changes layered on top.restore; for a whole filesystem from a known-good point in time, image is dramatically faster than file-level recursive restore.| Option | Effect |
|---|---|
| -subdir=yes / no | Recurse into subdirectories. Default for restore is no |
| -replace=all | Overwrite without prompting (scripts) |
| -replace=no | Skip files that already exist on disk |
| -replace=prompt | Ask per file (interactive only — default) |
| -ifnewer | Only restore if backup version is newer than file on disk |
| -inactive | Include inactive/expired versions in picker or query |
| -pick | Open interactive version picker |
| -pitdate=MM/DD/YYYY | Restore versions active as of date |
| -pittime=HH:MM:SS | Combine with -pitdate for time-of-day precision |
| -fromdate / -todate | Filter -pick or -inactive query to date range |
| -fromnode=<node> | Restore data backed up by another node (proxynode) |
| -filelist=/path/list.txt | Restore the list of files in the file (one per line) |
| -preservepath=subtree | Preserve relative path under destination |
| -preservepath=complete | Preserve full source path under destination |
| -preservepath=none | Strip source path entirely (default for single files) |
| -tapeprompt=no | Don't prompt for tape mounts (scripted restores) |
| -quiet | Suppress per-file output (good for large restores) |
| -verbose | Show every file as it's restored (default) |
-preservepath=subtree and source /home/jim/ being restored to /restore/, files land under /restore/jim/.... With -preservepath=complete, files land under /restore/home/jim/.... With -preservepath=none, files land directly in /restore/ with no preserved structure (risky for multiple files — use only for single files).| Symptom | Likely cause / check |
|---|---|
| "ANS1092W No files matching search criteria found" | Wrong stanza — try -servername= against the right node. Or the path doesn't exist in backups: q backup <path> |
| "ANS1247E File not found" with -pitdate | File didn't exist on that date, or was deleted before it. Run q backup <path> -inactive to see actual version dates |
| Restore is extremely slow | Data tiered to COS — first read fetches from cloud. Subsequent reads are from local cache. Plan for slower first restore on aged data |
| Files restored to wrong location | -preservepath misunderstanding, or trailing slash on dest missing — see -preservepath note above |
| "ANS1126E File exists, not replaced" | Default -replace=prompt and you said no, OR -replace=no. Re-run with -replace=all if intentional |
| Image restore fails with "filesystem mounted" | umount the target FS first. Image restore is block-level and requires exclusive access |
| "ANS1029E Communication with TSM server is lost" | Server down, network issue, or schedule window collision. Check server-side actlog around the timestamp |
| Wildcards don't match | Shell expanded the glob first. Quote them: restore "/var/log/*.log" |
| "ANS1898I" repeating in output | Informational only — large restore progress. Use -quiet to suppress |
QUERY ACTLOG BEGINTIME=-00:30 while the restore runs — every client action shows up there with the matching session ID. ANR1xxxE messages on the server side will explain client-side ANSxxxxE messages with full context (e.g. why a session dropped, whether the server rejected an auth attempt).